مقایسه رکوردهای دو جدول
اندازه‌ی قلم متن
تخمین مدت زمان مطالعه‌ی مطلب: یک دقیقه


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

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

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 استفاده کرد.

  • #
    ‫۱۵ سال و ۵ ماه قبل، سه‌شنبه ۵ خرداد ۱۳۸۸، ساعت ۱۰:۲۴
    جالب بود ولی این ها فقط برای SQL Server نیستند. بلکه دستورات کلی SQL هستند!
  • #
    ‫۱۵ سال و ۵ ماه قبل، سه‌شنبه ۵ خرداد ۱۳۸۸، ساعت ۱۴:۱۳
    من عموما مطالبی رو که توسط یک ناشناس طرح میشه رو حذف می‌‌کنم. محض اطلاع.
    +
    اپراتور except جزو استاندارد ANSI SQL است ولی تا اس کیوال سرور 2005 در این محصول پشتیبانی نمی‌شد. (درک ضمنی این مطلب از مقاله فوق کار مشکلی نیست)
  • #
    ‫۸ سال و ۷ ماه قبل، دوشنبه ۱۰ اسفند ۱۳۹۴، ساعت ۱۹:۲۶
    در ادامه مطلب جناب نصیری بازبینی پلن اجرائی دو دستور هم جالب توجه است.هر دو دستور یک پلان یکسان دارند ولی دستور Except فشرده‌تر و زیباتر است.
    ----SQL SERVER 2005 Method
    USE AdventureWorks;
    GO
    SELECT ProductID
    FROM Production.Product
    EXCEPT
    SELECT ProductID
    FROM Production.WorkOrder;
    GO
    
    ----SQL SERVER 2000 Method which works&nbspIN SQL SERVER 2005
    USE AdventureWorks;
    GO
    SELECT ProductID
    FROM Production.Product
    WHERE ProductID
    NOT IN (
    SELECT ProductID
    FROM Production.WorkOrder);
    GO
    تصویر پلان اجرائی دو کوئری :