ความแตกต่างที่ใหญ่ที่สุดคือไม่ได้อยู่ในการเข้าร่วมเทียบไม่ได้ที่มีอยู่ก็คือ (เขียน) SELECT *
ที่
ในตัวอย่างแรกคุณจะได้รับทุกคอลัมน์จากทั้งสอง A
และในขณะที่ในตัวอย่างที่สองคุณจะได้รับเพียงคอลัมน์จากB
A
ใน SQL Server ตัวแปรที่สองนั้นเร็วกว่าเล็กน้อยในตัวอย่างที่ง่ายมาก
สร้างตารางตัวอย่างสองตาราง:
CREATE TABLE dbo.A
(
A_ID INT NOT NULL
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
);
CREATE TABLE dbo.B
(
B_ID INT NOT NULL
PRIMARY KEY CLUSTERED
IDENTITY(1,1)
);
GO
แทรก 10,000 แถวในแต่ละตาราง:
INSERT INTO dbo.A DEFAULT VALUES;
GO 10000
INSERT INTO dbo.B DEFAULT VALUES;
GO 10000
ลบทุกแถวที่ 5 ออกจากตารางที่สอง:
DELETE
FROM dbo.B
WHERE B_ID % 5 = 1;
SELECT COUNT(*) -- shows 10,000
FROM dbo.A;
SELECT COUNT(*) -- shows 8,000
FROM dbo.B;
ดำเนินการชุดSELECT
คำสั่งทดสอบสองชุด:
SELECT *
FROM dbo.A
LEFT JOIN dbo.B ON A.A_ID = B.B_ID
WHERE B.B_ID IS NULL;
SELECT *
FROM dbo.A
WHERE NOT EXISTS (SELECT 1
FROM dbo.B
WHERE b.B_ID = a.A_ID);
แผนการดำเนินการ:
ตัวแปรที่สองไม่จำเป็นต้องทำการดำเนินการตัวกรองเนื่องจากสามารถใช้ตัวดำเนินการต่อต้านการรวมกึ่งซ้ายได้
WHERE A.idx NOT IN (...)
จะไม่เหมือนกันเนื่องจากพฤติกรรม trivalent ของNULL
(เช่นNULL
ไม่เท่ากับNULL
(และไม่เท่ากัน) ดังนั้นหากคุณมีใด ๆNULL
ในตัวtableB
คุณจะได้รับผลลัพธ์ที่ไม่คาดคิด!)