Je voulais exécuter une requête simple pour afficher toutes les lignes Table1
où une valeur de colonne principale n'est pas présente dans une colonne d'une autre table ( Table2
).
J'ai essayé d'utiliser:
SELECT * FROM Table1 WHERE Table1.principal NOT IN Table2.principal
C'est plutôt une erreur de syntaxe. La recherche Google m'a conduit à des forums où les gens disaient que MySQL ne prend pas en charge NOT IN
et que quelque chose d'extrêmement complexe doit être utilisé. Est-ce vrai? Ou est-ce que je fais une terrible erreur?
Réponses:
Pour utiliser IN, vous devez avoir un ensemble, utilisez plutôt cette syntaxe:
la source
table2.principal
peut l'êtreNULL
. Dans ce casNOT IN
, retournera toujoursFALSE
carNOT IN
est traité comme<> ALL
, qui compare toutes les lignes de la sous-requête commeTable1.principal <> table2.principal
, qui échoue lors de la comparaison avecNULL
:Table1.principal <> NULL
ne donnera pas lieu àTRUE
. Pour résoudre:NOT IN (SELECT principal FROM table2 WHERE principal IS NOT NULL)
.L'option de sous-requête a déjà reçu une réponse, mais notez que dans de nombreux cas, un
LEFT JOIN
peut être un moyen plus rapide de le faire:Si vous souhaitez vérifier plusieurs tables pour vous assurer qu'elles ne sont présentes dans aucune des tables (comme dans le commentaire de SRKR), vous pouvez utiliser ceci:
la source
NOT IN
&LEFT JOIN
. +1 les deuxNOT IN vs NOT EXISTS vs LEFT JOIN / IS NULL dans MySQL
[…]
[…]
[…]
(emphase ajoutée)
la source
Malheureusement, cela semble être un problème avec l'utilisation de MySql de la clause "NOT IN", la capture d'écran ci-dessous montre l'option de sous-requête renvoyant des résultats erronés:
la source
Attention
NOT IN
n'est pas un alias pour<> ANY
, mais pour<> ALL
!http://dev.mysql.com/doc/refman/5.0/en/any-in-some-subqueries.html
ne peut pas être remplacé par
Tu dois utiliser
la source