我正在对包含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