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

use*_*426 15 sql t-sql sql-server

抱歉,如果已经有了答案,我搜索并可能无法想出正确的关键字来找到它.

我有一张超过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)

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

假设Customers表只有(1,79,100).然后它将意味着14和123将不匹配.如何找到找不到匹配项的值.

我在我的例子中简化了.我的项目列表有超过300个ID,因此使用WHERE带有长列表的条件OR会很麻烦/笨拙.我曾想过与自我LEFT JOIN结合并识别NULL配对值,即14和123

有更优雅的方法吗?

Mar*_*ith 17

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

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

SELECT CustomerId
FROM   (VALUES(1),
              (79),
              (14),
              (100),
              (123)) V(CustomerId)
EXCEPT
SELECT CustomerId
FROM   Customers 
Run Code Online (Sandbox Code Playgroud)


Pir*_*App 5

如果有人偶然发现这个问题并且想知道如何在 PostgreSQL 中做到这一点

VALUES (1),(79),(14),(100),(123) EXCEPT ALL SELECT "CustomerId" from "Customers";
Run Code Online (Sandbox Code Playgroud)