PDA

View Full Version : مقایسه دو Select



Nightbat
سه شنبه 29 خرداد 1386, 11:39 صبح
چطور می تونم مقادیر دو Select را با هم مقایسه کنم؟ یعنی ببینم رکوردهاش با هم برابرند یا نه ( یا حتی رکورد های متفاوت رو داشته باشم )

Kamyar.Kimiyabeigi
سه شنبه 29 خرداد 1386, 12:48 عصر
برای اینکه تعداد رکوردهای هر SELECT رو بتونی بدست بیاری میتونی بعد از دستور SELECT کد زیر رو بنویسی


SELECT @@ROWCOUNT


برای اینکه تفاوت رکوردهای دو SELECT رو به دست بیاری اگر در هر دو SELECT تون فیلد مشترک داشته باشی به نظر من میتونی از RIGHT OUTTER JOIN و یا LEFT OUTTER JOIN استفاده کنی

Nightbat
سه شنبه 29 خرداد 1386, 15:31 عصر
برای اینکه تفاوت رکوردهای دو SELECT رو به دست بیاری اگر در هر دو SELECT تون فیلد مشترک داشته باشی به نظر من میتونی از RIGHT OUTTER JOIN و یا LEFT OUTTER JOIN استفاده کنی

یعنی چیکار کنم ؟

Hamid.Kad
سه شنبه 29 خرداد 1386, 17:39 عصر
یه روش به ذهنم میرسه شاید بدردت بخوره.
اگه فرض کنیم که فیلدهای هردو Select یکسان هستند میتونید از این روش استفاده کنید

select * into #t1 from table1 where expression1
select * into #t2 from table2 where expression2
select * into #Res from #t1 where Not Exists (Select * from #t2 where (#t1.field1=#t2.field1) and (#t1.field2=#t2.field2) and ... )

بعد از این دستورات میتونید مقدار متغیر ROWCOUNT@@ رو چک کنید.اگه صفر بود برابرند و اگر صفر نبود تفاضل t2 از t1 توی جدول موقت Res# ریخته شده.(البته برای اختلاف کل باید جای t1 و t2 رو عوض کرده و با حاصل قبلی UNION کنید.

whitehat
سه شنبه 29 خرداد 1386, 17:56 عصر
فکر نکنم لازم باشه اینقدر سختش کنید


select count(*) from table1 where expression1


یعنی چیکار کنم ؟
بر روی هر یک از جداول می توانید Query بزنید به شرط اینکه کلید آن در مجموعه join دو جدول وجد نداشته باشد

supporter
سه شنبه 29 خرداد 1386, 18:59 عصر
کد زیر بر اساس رابطه زیر در نظریه مجموعه هاست:

if A=B then (A U B) = A = B



DECLARE @n1 int, @n2 int, @n3 int
SELECT @n1 = COUNT(*) FROM table_source1
SELECT @n2 = COUNT(*) FROM table_source2
SELECt @n3 = COUNT (*)
FROM (SELECT * From table_source1
UNION
SELECT * From table_source2)A
IF ((@n1 <> @n2) OR (@n1 <> @n3) OR (@n2 <> @n3))
BEGIN
PRINT 'متفاوت'
SELECT F1, F2, ...
FROM (SELECT F1, F2, ... FROM table_source1
UNION ALL
SELECT F1, F2, ... FROM table_source2
)T
GROUP BY F1, F2, ...
HAVING Count(*) = 1
END
ELSE
PRINT 'یکسان'

Hamid.Kad
چهارشنبه 30 خرداد 1386, 08:25 صبح
این کدی که شما نوشتید همیشه جواب 'متفاوت ' رو بر میگردونه. چون اگه فرض کنیم که هر کدوم از جدولها دو رکورد دارند و مقادیر این 2 جدول با هم یکی هستند در این صورت n3@
مساوی 4 میشه که شرط n2<>n3 همیشه برقرار میشه. Union اجتماع رکوردهاست. نه اجتماع فیلدها

Kamyar.Kimiyabeigi
چهارشنبه 30 خرداد 1386, 08:43 صبح
در مثال زیر عددی که در خروجی میاد تفاوت رکوردهایی است که در authors وجود داره ولی در publishers وجود نداره پس اگر عدد خروجی صفر باشه یعنی تفاوتی بین این دو جدول نیست


USE pubs
SELECT COUNT(au_fname) FROM
(
SELECT a.au_fname, a.au_lname, p.pub_name
FROM authors a LEFT OUTER JOIN publishers p
ON a.city = p.city
) T1 WHERE T1.pub_name IS NULL

حالا به جای جداول authors و publishers شما میتونین Sub Query هاتونو بزارین البته به شرطی که فیلد مشترک داشته باشند (این فیلد باید unique باشه)

AminSobati
چهارشنبه 30 خرداد 1386, 10:33 صبح
در خصوص تعداد رکوردها فکر میکنم دوستان به اندازه کافی راهنمایی کرده باشند. برای کنترل یکسان بودن رکوردها، در SQL Server 2005 میتونین از فیلدها Checksum بگیرین:


select * from
(select shipcountry,shipcity, checksum(shipcountry,shipcity) as cs1 from orders) tmp1
full join
(select country,city, checksum(country,city) as cs2 from customers) tmp2
on tmp1.cs1=tmp2.cs2 order by 1,2,4,5

supporter
پنج شنبه 31 خرداد 1386, 06:38 صبح
این کدی که شما نوشتید همیشه جواب 'متفاوت ' رو بر میگردونه. چون اگه فرض کنیم که هر کدوم از جدولها دو رکورد دارند و مقادیر این 2 جدول با هم یکی هستند در این صورت n3@
مساوی 4 میشه که شرط n2<>n3 همیشه برقرار میشه. Union اجتماع رکوردهاست. نه اجتماع فیلدها

این طور نیست دوست عزیز،
چون از Union استفاده شده و نه از Union All اگه جدول‌ها یکسان و هر کدوم n تا رکورد داشته باشن در این صورت حاصل Union اونها هم n رکورد خواهد داشت.
نکته اینجاست که بر خلاف Union All که رکورد های تکراری رو هم می‌آره، Union رکوردهای متفاوت رو می‌آره و اگه رکوردی در هر دو جدول باشه در Query مربوط به Union اونها تنها یک بار آورده میشه.
در ضمن همون طوری که در کد بالا هم نوشته ام برای نمایش رکوردهای متفاوت باید از Union All استفاده کرد تا Count رکوردهای تکراری بزرگتر از یک بشه.