Ich habe einen sehr einfachen LEFT OUTER JOIN, um alle Ergebnisse aus der linken Tabelle und einige zusätzliche Informationen aus einer viel größeren Tabelle zurückzugeben. Die linke Tabelle enthält 4935 Datensätze. Wenn ich sie jedoch einer zusätzlichen Tabelle beitrete, ist die Anzahl der Datensätze erheblich größer.
Soweit mir bekannt ist, ist es ein absolutes Evangelium, dass ein LEFT OUTER JOIN alle Datensätze aus der linken Tabelle mit übereinstimmenden Datensätzen aus der rechten Tabelle und Nullwerten für alle Zeilen zurückgibt, die nicht übereinstimmen können. Daher verstehe ich, dass dies der Fall sein sollte Es ist unmöglich, mehr Zeilen zurückzugeben, als in der linken Tabelle vorhanden sind, aber es passiert trotzdem!
SQL Query folgt:
SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID
FROM SUSP.Susp_Visits LEFT OUTER JOIN
DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum
Vielleicht habe ich einen Fehler in der Syntax gemacht oder mein Verständnis von LEFT OUTER JOIN ist unvollständig, hoffentlich kann jemand erklären, wie dies geschehen könnte?
Nachtrag
Vielen Dank für die tollen Antworten. Mein Verständnis von LEFT OUTER JOINS ist jetzt viel besser. Kann jemand jedoch vorschlagen, wie diese Abfrage so geändert werden kann, dass nur so viele Datensätze zurückgegeben werden, wie in der linken Tabelle vorhanden sind?
Diese Abfrage dient lediglich dazu, einen Bericht zu erstellen, und die doppelten Übereinstimmungen verwirren die Sache einfach.
/ Postscript
quelle
Antworten:
Der LEFT OUTER JOIN gibt nach Möglichkeit alle Datensätze aus der LEFT-Tabelle zurück, die mit der RIGHT-Tabelle verknüpft sind.
Wenn es jedoch Übereinstimmungen gibt, werden weiterhin alle übereinstimmenden Zeilen zurückgegeben. Daher wird eine Zeile in LINKS, die mit zwei Zeilen in RECHTS übereinstimmt, wie ein INNER JOIN als zwei REIHEN zurückgegeben.
BEARBEITEN: Als Antwort auf Ihre Bearbeitung habe ich mir gerade Ihre Abfrage genauer angesehen und es sieht so aus, als würden Sie nur Daten aus der Tabelle LINKS zurückgeben. Wenn Sie also nur Daten aus der LEFT-Tabelle und nur eine Zeile für jede Zeile in der LEFT-Tabelle zurückgeben möchten, müssen Sie überhaupt keinen JOIN ausführen und können einfach SELECT direkt aus der LEFT-Tabelle ausführen.
quelle
Ergebnisse:
quelle
Das ist nicht unmöglich. Die Anzahl der Datensätze in der linken Tabelle entspricht der Mindestanzahl der zurückgegebenen Datensätze. Wenn die rechte Tabelle zwei Datensätze enthält, die mit einem Datensatz in der linken Tabelle übereinstimmen, werden zwei Datensätze zurückgegeben.
quelle
Als Antwort auf Ihr Postskriptum hängt das davon ab, was Sie möchten.
Sie erhalten (mögliche) mehrere Zeilen für jede Zeile in Ihrer linken Tabelle, da es mehrere Übereinstimmungen für die Verknüpfungsbedingung gibt. Wenn Sie möchten, dass Ihre Gesamtergebnisse die gleiche Anzahl von Zeilen aufweisen wie im linken Teil der Abfrage, müssen Sie sicherstellen, dass Ihre Verknüpfungsbedingungen eine 1: 1-Übereinstimmung verursachen.
Abhängig davon, was Sie tatsächlich möchten, können Sie alternativ Aggregatfunktionen verwenden (wenn Sie beispielsweise nur eine Zeichenfolge aus dem rechten Teil möchten, können Sie eine Spalte generieren, die eine durch Kommas getrennte Zeichenfolge der Ergebnisse auf der rechten Seite für diese linke Zeile ist.
Wenn Sie nur 1 oder 2 Spalten aus dem äußeren Join betrachten, können Sie eine skalare Unterabfrage verwenden, da Ihnen 1 Ergebnis garantiert wird.
quelle
Jeder Datensatz aus der linken Tabelle wird so oft zurückgegeben, wie übereinstimmende Datensätze in der rechten Tabelle vorhanden sind - mindestens 1, kann aber leicht mehr als 1 betragen.
quelle
LEFT OUTER JOIN gibt genau wie INNER JOIN (normaler Join) für jede Zeile in der linken Tabelle so viele Ergebnisse zurück, wie viele Übereinstimmungen in der rechten Tabelle gefunden wurden. Daher können Sie viele Ergebnisse erzielen - bis zu N x M, wobei N die Anzahl der Zeilen in der linken Tabelle und M die Anzahl der Zeilen in der rechten Tabelle ist.
Es ist die Mindestanzahl von Ergebnissen, die in LEFT OUTER JOIN immer garantiert mindestens N beträgt.
quelle
Könnte es eine Eins-zu-Viele-Beziehung zwischen der linken und der rechten Tabelle sein?
quelle
Achten Sie darauf, wenn Sie eine where-Klausel in der Tabelle "rechte Seite" einer Abfrage haben, die einen linken äußeren Join enthält ... Falls Sie auf der rechten Seite keinen Datensatz haben, der die where-Klausel erfüllt, dann den entsprechenden Datensatz der linken Seite 'Tabelle wird nicht im Ergebnis Ihrer Abfrage angezeigt ....
quelle
Wenn Sie nur eine Reihe von der rechten Seite benötigen
oder nur
quelle
Es scheint, als ob die Tabelle DATA.Dim_Member mehrere Zeilen pro Zeile SUSP.Susp_Visits enthält.
quelle
Wenn mehrere (x) Zeilen in Dim_Member einer einzelnen Zeile in Susp_Visits zugeordnet sind, enthält die Ergebnismenge x Zeilen.
quelle