我正在对包含id列表的表运行以下(Postgres)SQL。下面的SQL将返回下面列表*中找到的所有id。

select id from table
where id in (1,2,3,5,8,11,13,22,34,55);

如何返回包含在列表中但不在表中的ID?我意识到我可以使用一个临时表(包含列表)和一个左外连接来完成这个任务,但是有没有一个更快/更聪明的方法呢?

最佳答案

若要检查表中是否存在任意ID,请使用CTE并存在

WITH ids (id) AS ( VALUES (1),(2),(3),(5),(8),(11),(13),(22),(34),(55)
)
SELECT id
FROM ids
WHERE NOT EXISTS(SELECT TRUE FROM table WHERE table.id = ids.id)

注1:或者使用left join而不是WHERE NOT EXISTS
注2:可能需要添加适当的类型转换
或者您可以使用EXCEPT
WITH ids (id) AS ( VALUES (1),(2),(3),(5),(8),(11),(13),(22),(34),(55)
)
SELECT id
FROM ids
EXCEPT ALL
SELECT id FROM ids

08-04 10:43
查看更多