250 Stimmen

Wie kann ein LEFT OUTER JOIN mehr Datensätze zurückgeben, als in der linken Tabelle vorhanden sind?

Ich habe eine sehr einfache 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, doch wenn ich einen LEFT OUTER JOIN mit einer zusätzlichen Tabelle durchführe, ist die Anzahl der Datensätze deutlich größer.

Soweit ich weiß, 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, die nicht übereinstimmen, zurückgibt, so dass es nach meinem Verständnis unmöglich sein sollte, mehr Zeilen zurückzugeben, als in der linken Tabelle vorhanden sind, aber es passiert trotzdem!

Es folgt eine SQL-Abfrage:

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 oder mein Verständnis von LEFT OUTER JOIN ist unvollständig, hoffentlich kann jemand erklären, wie dies auftreten könnte?

Nachtrag

Vielen Dank für die großartigen Antworten, mein Verständnis von LEFT OUTER JOINS ist jetzt viel besser, könnte jemand jedoch eine Möglichkeit vorschlagen, diese Abfrage geändert werden könnte, so dass ich nur so viele Datensätze zurückgegeben, wie in der linken Tabelle vorhanden?

Diese Abfrage dient lediglich dazu, einen Bericht zu erstellen, und die doppelten Treffer verwirren die Sache nur.

/Postskript

7 Stimmen

Um "so viele Datensätze zurückzubekommen, wie in der linken Tabelle vorhanden sind", müssen Sie angeben, welche Zeile auf der rechten Seite ausgewählt werden soll, wenn es mehrere Übereinstimmungen gibt.

1 Stimmen

Wie spezifizieren Sie dies? Ich möchte, dass der erste Treffer zurückgegeben wird.

1 Stimmen

Sie müssen definieren, was unter dem ersten Spiel zu verstehen ist. Wollen Sie den frühesten Datensatz, den mit der höchsten ID oder was?

2voto

Manu Punkte 28059

Wenn mehrere (x) Zeilen in Dim_Member mit einer einzigen Zeile in Susp_Visits verbunden sind, gibt es x Zeilen in der Ergebnismenge.

1voto

Binita Bharati Punkte 3866

Die einzige Möglichkeit, wie Ihre Abfrage mehr Zeilen zurückgeben würde als die linke Tabelle (die SUSP.Susp_Visits in Ihrem Fall), ist, dass die Bedingung ( SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum ) mit mehreren Zeilen in der rechten Tabelle übereinstimmt, was bedeutet DATA.Dim_Member . Es gibt also mehrere Zeilen in der DATA.Dim_Member wo identische Werte vorhanden sind für DATA.Dim_Member.MembershipNum . Sie können dies überprüfen, indem Sie die folgende Abfrage ausführen:

select DATA.Dim_Member.MembershipNum, count(DATA.Dim_Member.MembershipNum) from DATA.Dim_Member group by DATA.Dim_Member.MembershipNum

0voto

user716255 Punkte 272

Da die linke Tabelle 4935 Datensätze enthält, vermute ich, dass Sie wollen, dass Ihre Ergebnisse 4935 Datensätze zurückgeben. Versuchen Sie dies:

create table table1
(siteID int, 
SuspReason int)

create table table2
(siteID int, 
SuspReason int)

insert into table1(siteID, SuspReason) values 
(1, 678), 
(1, 186), 
(1, 723)

insert into table2(siteID, SuspReason) values 
(1, 678),
(1, 965)

select distinct t1.siteID, t1.SuspReason
from table1 t1 left join table2 t2 on t1.siteID = t2.siteID and t1.SuspReason = t2.SuspReason

union 

select distinct t2.siteID, t2.SuspReason 
from table1 t1 right join table2 t2 on t1.siteID = t2.siteID and t1.SuspReason = t2.SuspReason

2 Stimmen

Die Frage bezog sich auf zwei Tabellen mit unterschiedlichen Spalten, von denen eine der anderen Hilfsdaten hinzufügt. Was Sie tun, ist die Anwendung einer Vereinigung auf zwei Tabellen mit derselben Struktur, was in der Frage des Autors nicht der Fall ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X