۱۳۸۸/۰۳/۰۴

مقايسه ركوردهاي دو جدول


گاهي از اوقات يك سري از امكانات جديد در دسترس هستند اما فراموش مي‌شوند. براي مثال روش يافتن ركوردهاي غير يكسان دو جدول يكسان. مثلا يك ديتابيس قديمي داريد دقيقا مشابه ديتابيس كاري فعلي با همان ساختار (ري استور شده از يك بك آپ). اكنون مي‌خواهيد بدانيد در طول اين مدت چه ركوردهايي به ديتابيس كاري اضافه شده كه در ديتابيس قديمي ري استور شده موجود نيست و كلا كدام ركوردها با هم متفاوتند. چه بايد كرد؟

مثال:
دو جدول موقتي يكسان زير را در نظر بگيريد.

CREATE TABLE #tableA
(
column1 INT,
column2 INT
)

INSERT INTO #tableA
VALUES
(1,1)
,(1, 2)
,(1, 3)
,(2, 1)

SELECT column1,
column2
FROM #tableA

CREATE TABLE #tableB
(
column1 INT,
column2 INT
)

INSERT INTO #tableB
VALUES
(1,1)
,(1, 3)
,(2, 2)

SELECT column1,
column2
FROM #tableB

يك سري ديتاي دلخواه به آن‌ها اضافه شده است. (از روش اضافه كردن چندين ركورد توسط يك عبارت insert كه در اس كيوال سرور 2008 معرفي شده، استفاده گرديده است)
#tableA
column1 column2
----------- -----------
1 1
1 2
1 3
2 1


#tableB
column1 column2
----------- -----------
1 1
1 3
2 2

اكنون مي‌خواهيم ركوردهايي از جدول A را كه در جدول B نيستند، پيدا كنيم. روش متداول انجام اين‌كار در اس كيوال سرور 2000 به صورت زير است:

SELECT column1,
column2
FROM #tableA
WHERE NOT EXISTS (
SELECT *
FROM #tableB
WHERE #tableA.column1 = #tableB.column1
AND #tableA.column2 = #tableB.column2
)

column1   column2
----------- -----------
1 2
2 1
و يا روش زيباتر انجام اين‌كار كه از اس‌كيوال سرور 2005 به بعد معرفي شده، به صورت زير مي‌باشد:
SELECT column1, column2 FROM #tableA
EXCEPT
SELECT column1, column2 FROM #tableB

column1   column2
----------- -----------
1 2
2 1
Except ركوردهاي منحصربفردي از كوئري سمت چپ را كه در كوئري سمت راست وجود ندارند، بر مي‌گرداند.
در اين حالت تعداد ستون‌هاي در نظر گرفته شده براي مقايسه بايد يكسان و يك نوع باشند.
همچنين اگر مي‌خواهيد ركوردهايي از جدول A را كه در جدول B وجود دارند بيابيد، مي‌توان از intersect استفاده كرد.