یافتن تفاوت دادهها بین دو جدول SQL Server: بررسی جامع LEFT JOIN, EXCEPT, NOT IN, NOT EXISTS
در این مقاله به روشهای مختلفی برای یافتن دادههای نامتوازن بین دو جدول در SQL Server میپردازیم، از جمله استفاده از LEFT JOIN, EXCEPT, NOT IN و NOT EXISTS.
برای شروع، دو جدول را ایجاد کرده و با دادههای نمونه پر میکنیم. هر دو جدول ساختار یکسانی خواهند داشت. جدول اول (TableA) شامل رکوردهای اضافی خواهد بود که در جدول دوم (TableB) موجود نیستند.
CREATE TABLE TableA (
Id INT PRIMARY KEY,
Name VARCHAR(50)
);
CREATE TABLE TableB (
Id INT PRIMARY KEY,
Name VARCHAR(50)
);
INSERT INTO TableA (Id, Name) VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie'),
(4, 'David'),
(5, 'Eve');
INSERT INTO TableB (Id, Name) VALUES
(1, 'Alice'),
(2, 'Bob'),
(3, 'Charlie'),
(6, 'Frank'),
(7, 'Grace');
سادهترین روش برای یافتن رکوردهایی که در TableA وجود دارند اما در TableB نیستند، استفاده از LEFT JOIN است.
در مثال زیر، TableA را با استفاده از LEFT JOIN به TableB بر اساس ستون Id متصل میکنیم. سپس نتایج را فیلتر میکنیم، جایی که Id از TableB برابر با NULL باشد. این نشان میدهد که رکورد متناظری در TableB برای رکورد مربوطه در TableA وجود ندارد.
SELECT
A.Id,
A.Name
FROM
TableA A
LEFT JOIN
TableB B ON A.Id = B.Id
WHERE
B.Id IS NULL;
عملگر EXCEPT سطرهای متمایز را از کوئری اول بازمیگرداند که توسط کوئری دوم خروجی داده نشدهاند. این عملگر برای پیدا کردن رکوردهای منحصر به فرد در یک جدول در مقایسه با دیگری بسیار کارآمد است.
SELECT Id, Name FROM TableA
EXCEPT
SELECT Id, Name FROM TableB;
عملگر NOT IN نیز میتواند برای یافتن دادههای نامتوازن استفاده شود. این عملگر رکوردهایی را از کوئری اول بازمیگرداند که مقدار ستون مشخصشده در آنها، در لیست مقادیر بازگردانده شده توسط سابکوئری وجود ندارد. این روش برای مقایسه کلیدهای اصلی یا ستونهای منحصر به فرد مفید است.
SELECT
Id,
Name
FROM
TableA
WHERE
Id NOT IN (SELECT Id FROM TableB);
عملگر NOT EXISTS مشابه NOT IN است، اما اغلب با مجموعهدادههای بزرگتر عملکرد بهتری دارد، زیرا میتواند ارزیابی را به محض یافتن (یا عدم یافتن در مورد NOT EXISTS) یک مطابقت متوقف کند. این رویکرد معمولاً به دلیل بهینهسازی داخلی پایگاه داده، سریعتر عمل میکند.
SELECT
A.Id,
A.Name
FROM
TableA A
WHERE
NOT EXISTS (SELECT 1 FROM TableB B WHERE B.Id = A.Id);