Eu queria executar uma consulta simples para exibir todas as linhas em Table1
que um valor da coluna principal não está presente em uma coluna em outra tabela ( Table2
).
Eu tentei usar:
SELECT * FROM Table1 WHERE Table1.principal NOT IN Table2.principal
Em vez disso, está lançando um erro de sintaxe. A pesquisa no Google me levou a fóruns onde as pessoas diziam que o MySQL não suporta NOT IN
e algo extremamente complexo precisa ser usado. Isso é verdade? Ou estou cometendo um erro horrendo?
Respostas:
Para usar IN, você deve ter um conjunto, use esta sintaxe:
fonte
table2.principal
pode serNULL
. Nesse casoNOT IN
, sempre retornaráFALSE
porqueNOT IN
é tratado como<> ALL
, que compara todas as linhas da subconsulta comoTable1.principal <> table2.principal
, que falha ao comparar comNULL
:Table1.principal <> NULL
não resultará emTRUE
. Para corrigir:NOT IN (SELECT principal FROM table2 WHERE principal IS NOT NULL)
.A opção de subconsulta já foi respondida, mas observe que em muitos casos a
LEFT JOIN
pode ser uma maneira mais rápida de fazer isso:Se você deseja verificar várias tabelas para garantir que ela não esteja presente em nenhuma das tabelas (como no comentário do SRKR), você pode usar o seguinte:
fonte
NOT IN
&LEFT JOIN
. +1 em ambosNOT IN vs. NOT EXISTS vs. LEFT JOIN / É NULL no MySQL
[...]
[...]
[...]
(ênfases adicionadas)
fonte
Infelizmente, parece haver um problema com o uso do MySQL da cláusula "NOT IN", a captura de tela abaixo mostra a opção de subconsulta retornando resultados incorretos:
fonte
Cuidado
NOT IN
não é um apelido para<> ANY
, mas para<> ALL
!http://dev.mysql.com/doc/refman/5.0/en/any-in-some-subqueries.html
não pode ser substituído por
Você deve usar
fonte