Estou tentando executar esta consulta:
SELECT mac, creation_date
FROM logs
WHERE logs_type_id=11
AND mac NOT IN (select consols.mac from consols)
Mas não consigo resultados. Eu testei e sei que há algo errado com a sintaxe. No MySQL, essa consulta funciona perfeitamente. Eu adicionei uma linha para ter certeza de que há uma mac
que não existe na consols
tabela, mas ainda não está dando resultados.
postgresql
subquery
skowron-line
fonte
fonte
consols.mac
colunaNULL
ouNOT NULL
?Respostas:
Ao usar NOT IN, você deve garantir que nenhum dos valores seja NULL:
SELECT mac, creation_date FROM logs WHERE logs_type_id=11 AND mac NOT IN ( SELECT mac FROM consols WHERE mac IS NOT NULL -- add this )
fonte
WHERE mac IS NOT NULL
cláusula na subconsulta não é necessária, poisIn(...)
sempre remove NULLs (e duplicatas). Porque um conjunto não pode conter NULLsIS NOT NULL
. O aninhadoSELECT
estava retornando algunsNULLS
, e isso estava atrapalhando oIN(SELECT...)
.IS NOT NULL
causas disso funcionar.NULL
em umaNOT IN
cláusula não funciona porque uma comparação comNULL
não é verdadeira nem falsa. sqlbadpractices.com/using-not-in-operator-with-null-valuesis not null
se a subconsulta não produzir valores correspondentes e pelo menos umnull
valor. Da seção 9.22 do manual atual do PostgreSQL (versão 10): "[...] se não houver valores iguais à direita e pelo menos uma linha à direita resultar em nulo, o resultado da construção NOT IN será nulo, não verdadeiro . "Ao usar NOT IN, você também deve considerar NOT EXISTS, que trata os casos nulos silenciosamente. Veja também PostgreSQL Wiki
SELECT mac, creation_date FROM logs lo WHERE logs_type_id=11 AND NOT EXISTS ( SELECT * FROM consols nx WHERE nx.mac = lo.mac );
fonte
NOT EXISTS
vs... NOT IN
Você também pode usar uma condição LEFT JOIN e IS NULL:
SELECT mac, creation_date FROM logs LEFT JOIN consols ON logs.mac = consols.mac WHERE logs_type_id=11 AND consols.mac IS NULL;
Um índice nas colunas "mac" pode melhorar o desempenho.
fonte