sql - 选择 IN() 列表中未找到的内容

标签 sql sql-server tsql

我有一个包含 1000 多个表的表(例如 Customers)。

我有一个查询,需要已知客户列表的详细信息(例如按 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 会很麻烦/笨拙。我考虑过与 self LEFT JOIN 结合并识别 NULL 配对值,即 14 和 123

有更优雅的方法吗?

最佳答案

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

下面使用table value constructor作为派生表(与 SQL Server 2008+ 兼容)

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

关于sql - 选择 IN() 列表中未找到的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17209460/

相关文章:

mysql - 具有自动增量列的插入性能

sql - 通过 SQL 返回硬编码值的不同方式

VBA 列限制中的 SQL 命令

SQL查看表中两列或多列是否大于0

SqlServer 和 nvarchar(最大)

php - 从通过关系连接的两个表中删除

tsql - SQL Join 查询,获取 ManagerName

mysql - 左连接条件

MySQL选择一个字段小于前一个记录,一个字段大于前一个记录的行

sql - 如何在sql server中使用select语句结果更新表