2
respostas

Porque usar NOT IN e não NOT EXISTS?

Olá Victorino , tudo bem?

Estou com duvida na query " delete from PRODUTOS where CODIGO not in (select CODIGO_ID_PRODUTO from TABELA_DE_PRODUTOS); "

Porque usar o NOT IN na query e não o NOT EXISTS?

2 respostas

Olá Tiago, vou tomar a liberdade para tentar responder sua dúvida. Qualquer coisa o Victorino me corrige.

NOT INe NOT EXISTS possuem comportamentos diferentes quanto ao tratamento de valores NULOS.

Usando IN ou NOT INretornará NULL na comparação com valores da Subquery, enquanto que usando EXISTS NOT EXISTS você não teria esse impacto dos valores nulos por ser verificado exclusivamente a existencia das tuplas/registros que retornam da Subquery.

Ex:

SELECT *
 FROM
 table_name
WHERE
 id NOT IN(subquery);

Vamos considerar que a subqueryretorne os valores 1, 2, 3 e NULL, então a query poderia ser rescrita assim:

SELECT *
 FROM
    table_name
WHERE
    id = 1
    OR id = 2  
    OR id = 3
    OR id = NULL;

E dessa forma essa query sempre retornará NULL por que NULL não pode ser comparado com nada.

Faz esse testes ae!

Abs,

Olá Tiago, tudo bem? É isso mesmo que o Wagner falou, vou tentar contribuir com a resposta do Wagner! Bem como o Wagner argumentou "NOT IN e NOT EXISTS possuem comportamentos diferentes quanto ao tratamento de valores NULOS". Assim, se algum dos valores presentes bloco que será utilizado pelo NOT IN tiver o valor NULL então a query sempre irá retornar NULL, já o operador NOT EXISTS verifica apenas a existência de linhas na subconsulta, portanto valores NULL não afetam o resultado da query.

Espero ter contribuído!