Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ifietz

NOT IN - Não retorna valores

Recommended Posts

Olá Pessoal, tenho uma dúvida:

Uma consulta muito simples mas não está me retornando resultado:

 

Tenho duas tabelas X e Y

Tabela X contém todos os registros que chamamos de 'acesso';

Na Tabela Y só deverão estar aqueles que chamamos 'marcação'.

 

Quero os registros que estejam em X e não estejam em Y.

Ou seja, que não possuem marcação.

 

 

select id_codigo from x where id_codigo not in (select id_codigo from y)

 

Está retornando vazio. O que pode ser o erro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O que retorna apenas o subselect ?

 

Select id_codigo from y

 

O select parece certo, pode realmente não ter de retornar nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por questão de desempenho utilize left join, e realmente a query esta correta, pode ser que a sua clausula não esteja sendo verdadeira e por isso não retorna valores.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por questão de desempenho utilize left join, e realmente a query esta correta, pode ser que a sua clausula não esteja sendo verdadeira e por isso não retorna valores.

Não somente desempenho.

Existe um problema, por assim dizer quando usamos o NOT IN, principalmente para retornar valores NULL ou campos do tipo nvarchar(max) entre outros.

 

@ifietz, o uso do left como citado pelo @Faabiianooc pode lhe ser útil. Tem vários posts demonstrando seu uso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

De fato o outer join testando o nul é em geral mais rápido, mas isto depende da quantidade de registros, eu prefiro em alguns casos usar o NOT IN ou NOT EXISTS pela clareza..

 

com not exists

 

 

select id_codigo 
from x 
where id_codigo not exists (select null 
                            from y 
                            where y.id_codigo = x.id_codigo)

 

 

... mas se a subquery retorna 1.234.567 registros e a query tem 7.654.321 registros concordo que o bicho pega....

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tome cuidado com o uso dele, pode retornar resultados "inesperados"

para que ele opere igual ao not in, nao pode esquecer de colocar coluna chave is not null

Por exemplo

select id_codigo from x 
left join y
on x.id_codigo = y.id_codigo
where y.id_codigo is not null

Eu sei que não existe a coluna null, mas é retornado todas as linhas da esquerda independente se existe referencia ou nao, os que não existe retorna as colunas da tabela direita como null, por isso eu coloquei is not null, confuso, mas é isso ai!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.