Ich habe zwei Tabellen mit verbindlichem Primärschlüssel in der Datenbank und möchte einen disjunkten Satz zwischen ihnen finden. Beispielsweise,
Table1
hat Spalten (ID, Name
) und Beispieldaten:(1 ,John), (2, Peter), (3, Mary)
Table2
hat Spalten (ID, Address
) und Beispieldaten:(1, address2), (2, address2)
So wie erstelle ich eine SQL - Abfrage , damit ich die Zeile mit der ID holt aus , table1
dass nicht in ist table2
. In diesem Fall (3, Mary)
sollte zurückgegeben werden?
Ps. Die ID ist der Primärschlüssel für diese beiden Tabellen.
Danke im Voraus.
sql
database
postgresql
Johnklee
quelle
quelle
Antworten:
Versuche dies
quelle
Verwenden
LEFT JOIN
quelle
Grundsätzlich gibt es drei Ansätze , dass:
not exists
,not in
undleft join / is null
.LINKS VERBINDEN mit IST NULL
NICHT IN
EXISTIERT NICHT
Welches ist besser? Die Antwort auf diese Frage ist möglicherweise besser, wenn sie auf wichtige spezifische RDBMS-Anbieter aufgeteilt wird. Im Allgemeinen sollte die Verwendung vermieden werden,
select ... where ... in (select...)
wenn die Größe der Anzahl der Datensätze in der Unterabfrage unbekannt ist. Einige Anbieter beschränken möglicherweise die Größe. Oracle hat beispielsweise ein Limit von 1.000 . Am besten probieren Sie alle drei aus und zeigen den Ausführungsplan.Speziell für PostgreSQL sind Ausführungsplan
NOT EXISTS
undLEFT JOIN / IS NULL
gleich. Ich persönlich bevorzuge dieNOT EXISTS
Option, weil sie die Absicht besser zeigt. Schließlich ist die Semantik, dass Sie Datensätze in A finden möchten, deren pk in B nicht vorhanden sind .Alt, aber immer noch Gold, spezifisch für PostgreSQL: https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/
quelle
Schnelle Alternative
Ich habe einige Tests (auf Postgres 9.5) mit zwei Tabellen mit jeweils ~ 2 Millionen Zeilen durchgeführt. Diese Abfrage unten hat mindestens 5 * besser abgeschnitten als die anderen vorgeschlagenen Abfragen:
quelle
Unter Berücksichtigung der Punkte, die in @John Woos Kommentar / Link oben gemacht wurden, würde ich normalerweise so damit umgehen:
quelle
quelle