Ich wollte eine einfache Abfrage ausführen, um alle Zeilen aufzurufen, in Table1
denen ein Hauptspaltenwert in einer Spalte in einer anderen Tabelle ( Table2
) nicht vorhanden ist .
Ich habe versucht:
SELECT * FROM Table1 WHERE Table1.principal NOT IN Table2.principal
Dies löst stattdessen einen Syntaxfehler aus. Die Google-Suche führte mich zu Foren, in denen Leute sagten, dass MySQL nicht unterstützt NOT IN
und etwas extrem Komplexes verwendet werden muss. Ist das wahr? Oder mache ich einen schrecklichen Fehler?
Antworten:
Um IN verwenden zu können, müssen Sie einen Satz haben. Verwenden Sie stattdessen diese Syntax:
quelle
table2.principal
kann seinNULL
. In diesem FallNOT IN
wird immer zurückgegeben,FALSE
weilNOT IN
behandelt wird als<> ALL
, was alle Zeilen aus der Unterabfrage wie vergleichtTable1.principal <> table2.principal
, was beim Vergleich mit fehlschlägtNULL
:Table1.principal <> NULL
führt nicht zuTRUE
. So beheben Sie :NOT IN (SELECT principal FROM table2 WHERE principal IS NOT NULL)
.Die Unterabfrageoption wurde bereits beantwortet. Beachten Sie jedoch, dass a in vielen Fällen
LEFT JOIN
eine schnellere Möglichkeit ist, dies zu tun:Wenn Sie mehrere Tabellen überprüfen möchten, um sicherzustellen, dass sie in keiner der Tabellen vorhanden sind (wie im Kommentar von SRKR), können Sie Folgendes verwenden:
quelle
NOT IN
&LEFT JOIN
. +1 beideNOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL in MySQL
[…]
[…]
[…]
(Hervorhebungen hinzugefügt)
quelle
Leider scheint es ein Problem mit der MySQL-Verwendung der "NOT IN" -Klausel zu sein. Der folgende Screenshot zeigt die Unterabfrageoption, die falsche Ergebnisse zurückgibt:
quelle
Seien Sie vorsichtig, es
NOT IN
ist kein Alias für<> ANY
, sondern für<> ALL
!http://dev.mysql.com/doc/refman/5.0/en/any-in-some-subqueries.html
kann nicht ersetzt werden durch
Sie müssen verwenden
quelle