25

我有一张有 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会很麻烦/笨拙。我曾考虑与 self LEFT JOIN 结合并识别 NULL 配对值,即 14 和 123

有没有更优雅的方法?

4

3 回答 3

25

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

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

SELECT CustomerId
FROM   (VALUES(1),
              (79),
              (14),
              (100),
              (123)) V(CustomerId)
EXCEPT
SELECT CustomerId
FROM   Customers 
于 2013-06-20T09:04:20.833 回答
4

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

VALUES (1),(79),(14),(100),(123) EXCEPT ALL SELECT "CustomerId" from "Customers";
于 2019-11-24T04:43:25.540 回答
1

没有错,LEFT JOIN但您也可以使用not exists

SELECT * 
FROM Customers c
WHERE not exists (select * from CustomerDetails ds where ds.CustomerId = c.CustomerId)
于 2013-06-20T09:06:09.527 回答