it-swarm.com.de

PostgreSQL 'NOT IN' und Unterabfrage

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 ich weiß, dass etwas mit der Syntax nicht stimmt. In MySQL funktioniert eine solche Abfrage einwandfrei. Ich habe eine Zeile hinzugefügt, um sicherzustellen, dass es eine mac gibt, die in der consols -Tabelle nicht vorhanden ist, aber dennoch keine Ergebnisse liefert.

79
skowron-line

Wenn Sie NOT IN verwenden, sollten Sie sicherstellen, dass keiner der Werte NULL ist:

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
)
141
Mark Byers

Wenn Sie NOT IN verwenden, sollten Sie auch NOT EXISTS berücksichtigen, das die Null-Fälle stillschweigend behandelt. Siehe auch 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
  );
27
wildplasser

Sie können auch eine LEFT JOIN- und IS NULL-Bedingung verwenden:

SELECT 
  mac, 
  creation_date 
FROM 
  logs
    LEFT JOIN consols ON logs.mac = consols.mac
WHERE 
  logs_type_id=11
AND
  consols.mac IS NULL;

Ein Index für die "mac" -Spalten kann die Leistung verbessern.

6
Frank Heikens