Digamos que eu tenha o seguinte esquema e dados:
create table images(
id int not null
);
insert into images values(1), (2), (3), (4), (6), (8);
Eu quero realizar uma consulta como:
select id from images where id not exists in(4, 5, 6);
Mas isso não funciona. O caso acima deve retornar 5
, pois não existe nos registros da tabela.
Você pode usar uma junção externa em uma
values
lista (semelhante à resposta de Martin mencionada acima):ou a
not exists
junto com o construtor de linha:Se desejar, você também pode colocar a
values
cláusula em um CTE para facilitar a leitura da consulta final:Uma maneira de fazer isso seria usar
VALUES
para criar uma expressão de tabela com os ids para verificar eEXCEPT
encontrar os ausentes.Ao usar
EXCEPT
como @Martin fornecido , lembre-se de fazê-loEXCEPT
ALL
, a menos que você queira pagar um pouco mais por tentar dobrar duplicatas.BTW, uma
VALUES
expressão pode ficar por conta própria:Mas você obtém nomes de coluna padrão dessa maneira.
Para uma longa lista de valores, pode ser mais conveniente fornecê-la como array e unnest. Sintaxe mais curta:
Existem algumas técnicas básicas para a tarefa:
Basta usar uma segunda mesa e juntá-los.