Ich versuche diese Abfrage auszuführen:
SELECT mac, creation_date
FROM logs
WHERE logs_type_id=11
AND mac NOT IN (select consols.mac from consols)
Aber ich bekomme keine Ergebnisse. Ich habe es getestet und weiß, dass etwas mit der Syntax nicht stimmt. In MySQL funktioniert eine solche Abfrage perfekt. Ich habe eine Zeile hinzugefügt, um sicherzugehen, dass es eine mac
gibt, die nicht in der consols
Tabelle vorhanden ist, aber dennoch keine Ergebnisse liefert .
postgresql
subquery
Skowron-Linie
quelle
quelle
consols.mac
SpalteNULL
oderNOT NULL
?Antworten:
Wenn Sie NOT IN verwenden, sollten Sie sicherstellen, dass keiner der Werte NULL ist:
quelle
WHERE mac IS NOT NULL
Klausel in der Unterabfrage wird nicht benötigt, daIn(...)
immer NULL-Werte (und Duplikate) entfernt werden. Weil ein Set keine NULL-IS NOT NULL
. Die VerschachteltenSELECT
kehrten ein paar zurückNULLS
, und das stolperte über dieIN(SELECT...)
.IS NOT NULL
dies funktioniert.NULL
in einerNOT IN
Klausel nicht funktioniert, da ein Vergleich mitNULL
weder wahr noch falsch ist. sqlbadpractices.com/using-not-in-operator-with-null-valuesis not null
wenn die Unterabfrage keine übereinstimmenden Werte und mindestens einennull
Wert erzeugt. Aus Abschnitt 9.22 des aktuellen PostgreSQL-Handbuchs (Version 10): "[…] Wenn es keine gleichen Werte für die rechte Hand gibt und mindestens eine rechte Zeile null ergibt, ist das Ergebnis des Konstrukts NOT IN null und nicht wahr . "Wenn Sie NOT IN verwenden, sollten Sie auch NOT EXISTS berücksichtigen, das die Nullfälle still behandelt. Siehe auch PostgreSQL Wiki
quelle
NOT EXISTS
vs... NOT IN
Sie können auch die Bedingung LEFT JOIN und IS NULL verwenden:
Ein Index für die "Mac" -Spalten kann die Leistung verbessern.
quelle