Encontre IDs de uma lista que não existe em uma tabela


19

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 executar 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.

Respostas:


23

Você pode usar uma junção externa em uma valueslista (semelhante à resposta de Martin mencionada acima):

select t.id
from (
  values (4),(5),(6) 
) as t(id)
  left join images i on i.id = t.id
where i.id is null;

ou um not existsjunto com o construtor de linha:

select *
from ( 
   values (4),(5),(6)
) as v(id)
where not exists (select *
                  from images i
                  where i.id = v.id);

Se desejar, você também pode colocar a valuescláusula em um CTE para facilitar a leitura final da consulta:

with v (id) as (
 values (4),(5),(6)
)
select v.id
from v
  left join images i on i.id = v.id
where i.id is null;

10

Uma maneira de fazer isso seria usar VALUESpara criar uma expressão de tabela com os IDs para verificar e EXCEPTencontrar os ausentes.

SELECT id
FROM (VALUES(4),(5),(6)) V(id)
EXCEPT
SELECT id 
FROM images;

6

Embora utilizando EXCEPTcomo @ Martin fornecido , lembre-se de fazê-lo EXCEPTALL, a menos que você quer pagar um pouco mais para tentar dobrar duplicatas.

BTW, uma VALUESexpressão pode se sustentar sozinha:

VALUES (4),(5),(6)
EXCEPT ALL
SELECT id FROM images;

Mas você obtém os nomes das colunas padrão dessa maneira.

Para uma longa lista de valores, pode ser mais conveniente fornecê-lo como matriz e desnaturar. Sintaxe mais curta:

SELECT * FROM unnest('{4,5,6}'::int[]) id
EXCEPT ALL
SELECT id FROM images;

Existem algumas técnicas básicas para a tarefa:


0

Apenas use uma segunda mesa e junte-se a eles.

create table images1(
  id int not null
);

create table images2(
  id int not null
);

insert into images1 values(1), (2), (3), (4), (6), (8);

insert into images2 values (4), (5), (6);

SELECT i2.ID

FROM images2 i2

LEFT JOIN images1 i1
    ON i1.ID = i2.ID

WHERE i1.ID IS NULL

3
Se você estiver executando uma seleção simples e criando uma tabela apenas para isso, pode não ser a melhor solução.
Patrick D'appollonio
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.