一尘不染

选择在IN()列表中找不到的那些

sql

我的桌子上有1000多个桌子(例如客户)。

我有一个查询,要求了解已知客户列表的详细信息(例如,按CustomerID-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)

问题

如何找到未返回或未从列表中找到匹配项的客户列表?

假设“客户”表仅包含(1,79,100)。那么这将意味着14和123将不匹配。如何找到找不到匹配项的值。

我在示例中进行了简化。我的商品清单有300多个ID,因此,使用WHERE带有较长商品清单的条件OR会很麻烦/笨拙。我曾想过与自我LEFTJOIN结合并确定NULL配对值,即14和123

有没有更优雅的方法?


阅读 178

收藏
2021-03-17

共1个答案

一尘不染

例如,您可以使用派生表或临时表来保存列表,CustomerId然后使用查找不匹配的表EXCEPT

下面使用表值构造函数作为派生表(与SQL Server 2008+兼容)

SELECT CustomerId
FROM   (VALUES(1),
              (79),
              (14),
              (100),
              (123)) V(CustomerId)
EXCEPT
SELECT CustomerId
FROM   Customers
2021-03-17