Postgres SQL:使用in子句时查找异常

时间:2018-12-03 17:01:19

标签: sql postgresql left-join temp-tables

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

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

如何返回列表中包含但表中没有的ID?我意识到我可以使用临时表(带有列表)和左外部联接来做到这一点,但是有一种更快/更聪明的方法吗?

1 个答案:

答案 0 :(得分:2)

要检查表中是否存在任意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)

note1:或者使用left join代替WHERE NOT EXISTS

note2:可能需要添加适当的类型强制转换

或者您可以使用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