Sql-Server

EXCEPT 運算符與 NOT IN

  • August 18, 2019

運算符是在 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上的兩者之間的一個很好的比較。

引用自:https://dba.stackexchange.com/questions/83684