2013-06-20 58 views
9

道歉,如果已經有這個答案,我搜索了,可能wouldnt認爲正確的關鍵字找到它。選擇那些在IN()名單中找不到的

我有一個超過1000個表(例如客戶)的表。

我有需要的客戶的一個已知列表的詳細信息的查詢(例如通過客戶ID - 1,79,14,100,123)

的IN()函數是我想用在查詢什麼。

我知道找到匹配列表的客戶,我會寫:

SELECT * FROM Customers WHERE CustomerID IN (1,79,14,100,123)

爲了找到那些不在列表中,我會寫

SELECT * FROM Customers WHERE CustomerID NOT IN (1,79,14,100,123)

問題

如何找到Cust列表omers表示未返回或未從列表中找到匹配項。

假設Customers表只有(1,79,100)。那麼這意味着14和123將不會匹配。我如何找到那些找不到匹配的值。

我簡化了我的例子。我的物品列表中有超過300個ID,因此使用WHERE條件與長列表OR會很麻煩/笨拙。我曾想過將自己的LEFT JOIN與自己的LEFT JOIN結合在一起,並確定NULL配對值,這將是14和123

是否有更優雅的方法?

回答

12

例如,您可以使用派生表或臨時表來保存CustomerId的列表,然後找到與EXCEPT不匹配的列表。

以下使用table value constructor作爲派生表

SELECT CustomerId 
FROM (VALUES(1), 
       (79), 
       (14), 
       (100), 
       (123)) V(CustomerId) 
EXCEPT 
SELECT CustomerId 
FROM Customers 
+1

的感謝@馬丁史密斯。那回答了!出於興趣,你會知道是否有ANSI SQL兼容版本? – user919426

+1

@ user919426 - EXCEPT絕對是ANSI SQL(儘管Oracle使用非標準的'MINUS')。我認爲表值構造函數也包含在標準的某個版本中。 –

+0

很高興知道。再次感謝! – user919426

1

(與SQL Server 2008+兼容)沒有什麼錯,但LEFT JOIN您還可以使用not exists

SELECT * 
FROM Customers c 
WHERE not exists (select * from CustomerDetails ds where ds.CustomerId = c.CustomerId) 
+0

謝謝,儘管我沒有回答這個問題,因爲我想要所有CustomerIDs在IN語句中如果CustomerIDs沒有從列表中匹配。 – user919426

相關問題