Sql-Server
EXCEPT 運算符與 NOT IN
運算符是在 SQL Server 2005 中引入的,但和 和有什麼
EXCEPT
區別?NOT IN``EXCEPT
它做同樣的事情嗎?我想用一個例子做一個簡單的解釋。
EXCEPT
和之間有兩個主要區別NOT IN
。除了
EXCEPT
過濾DISTINCT
左側表格中未出現在右側表格中的值。NOT EXISTS
它與使用DISTINCT
子句基本相同。它還期望兩個表(或表中的列子集)在查詢的左側和右側具有相同數量的列
例如,您不能這樣做:
SELECT ID, Name FROM TableA EXCEPT SELECT ID FROM TableB
這將導致錯誤:
使用 UNION、INTERSECT 或 EXCEPT 運算符組合的所有查詢必須在其目標列表中具有相同數量的表達式。
不在
NOT IN
不過濾DISTINCT
值並返回左側表中未出現在右側表中的所有值。
NOT IN
要求您將一個表中的單個列與另一個表或子查詢中的單個列進行比較。例如,如果您的子查詢要返回多個列:
SELECT * FROM TableA AS nc WHERE ID NOT IN (SELECT ID, Name FROM TableB AS ec)
您會收到以下錯誤:
當不使用 EXISTS 引入子查詢時,選擇列表中只能指定一個表達式。
但是,如果右側表
NULL
在被 過濾的值中包含 a,NOT IN
則返回空結果集,可能會產生意外結果。例子
CREATE TABLE #NewCustomers (ID INT); CREATE TABLE #ExistingCustomers (ID INT); INSERT INTO #NewCustomers ( ID ) VALUES (8), (9), (10), (1), (3), (8); INSERT INTO #ExistingCustomers ( ID ) VALUES ( 1) , (2), (3), (4), (5); -- EXCEPT filters for DISTINCT values SELECT * FROM #NewCustomers AS nc EXCEPT SELECT * FROM #ExistingCustomers AS ec -- NOT IN returns all values without filtering SELECT * FROM #NewCustomers AS nc WHERE ID NOT IN (SELECT ID FROM #ExistingCustomers AS ec)
從上面的兩個查詢中,
EXCEPT
返回 3 行#NewCustomers
,過濾掉匹配的 1 和 3#ExistingCustomers
以及重複的 8。
NOT IN
不執行此不同的過濾並從#NewCustomers
重複的 8 中返回 4 行。如果我們現在將 a 添加
NULL
到#ExistingCustomers
表中,我們會看到由 返回的相同結果EXCEPT
,但是NOT IN
將返回一個空結果集。INSERT INTO #ExistingCustomers ( ID ) VALUES ( NULL ); -- With NULL values in the right-hand table, EXCEPT still returns the same results as above SELECT * FROM #NewCustomers AS nc EXCEPT SELECT * FROM #ExistingCustomers AS ec -- NOT IN now returns no results SELECT * FROM #NewCustomers AS nc WHERE ID NOT IN (SELECT ID FROM #ExistingCustomers AS ec) DROP TABLE #NewCustomers; DROP TABLE #ExistingCustomers;
取而代之的是
NOT IN
,您應該真正查看Gail Shaw 的部落格NOT EXISTS
上的兩者之間的一個很好的比較。