reihenfolge der operanden bei join's

ruutaiokwu

Top Contributor
hallo zusammen

jemand hat mir gesagt, dass es bei sql-join's relevant ist wie die reihenfolge der "operanden" beim vergleichsoperator definiert werden. als test-db habe ich die "credit"-db von sql server genommen:

SQL:
SELECT
  *
FROM member mbr

LEFT JOIN payment pmt
ON ([B][COLOR="Red"]pmt.member_no = mbr.member_no[/COLOR][/B])

sowie

SQL:
SELECT
  *
FROM member mbr

LEFT JOIN payment pmt
ON ([B][COLOR="Red"]mbr.member_no = pmt.member_no[/COLOR][/B])


...wie ich aber sehe kommt immer das gleiche dabei raus.

ein anderes beispiel: es gibt a.) eine kundentabelle (adressdaten etc.) sowie b.) eine bestellungstabelle.

nun möchte man allen kunden mit allen bestellungen (wenn vorhanden! daher "left join") ausgeben:

(pseudo-code)
SQL:
SELECT * FROM kunden LEFT JOIN bestellungen ON (kunden.ID = bestellungen.ID)



im anderen fall möchte man alle bestellungen wenn möglich zusätzlich mit kunden ausgeben, jedoch auch wenn der kunden in der zwischenzeit gelöscht wurde (foreign key -> "SET NULL" beim löschen des PK's in der kundentabelle!)

(pseudo-code)
SQL:
SELECT * FROM bestellungen LEFT JOIN kunden ON (kunden.ID = bestellungen.ID)



...das ist doch die einzige art und weise wie man das "gegenteil" erreichen kann, oder macht man das wirklich mit der umkehrung der operanden??? leider fehlt mit z.zt. die möglichkeit das praktisch zu testen.

und: bei einem "OUTER JOIN" ist es irrelevant welche tabelle beim "SELECT" und welche beim "JOIN" angegeben wird, wahrscheinlich auch beim "OUTER JOIN"...? sehe ich das richtig?


vielen dank für eure feedbacks.
 
Wenn ich dich richtig verstehe suchst du einfach den RIGHT JOIN oder?

Hier mal ein paar Beispiele:

1. LEFT JOIN
Selektiert alle Kunden mit dazugehöriger Bestellung, auch die Kunden ohne Bestellung
SQL:
SELECT Kunde.*,Bestellung.* FROM Kunde LEFT JOIN Bestellung ON Kunde.BestellungID = Bestellung.ID

2. RIGHT JOIN
Selektiert nur Kunden mit dazugehöriger Bestellung, auch Bestellungen ohne Kunden. (Bissel verwirrend, kanns nicht anders erklären^^)
SQL:
SELECT Kunde.*,Bestellung.* FROM Kunde RIGHTJOIN Bestellung ON Kunde.BestellungID = Bestellung.ID

3. INNER JOIN
Selektiert nur Kunden welche auch Bestellung haben
SQL:
SELECT Kunde.*,Bestellung.* FROM Kunde INNER JOIN Bestellung ON Kunde.BestellungID = Bestellung.ID

4. OUTER JOIN
Kenn ich garnicht.. sry
 
hallo Times

vielen dank für dein feedback.

das mit dem join's war "einigermassen" klar. (gemäss code-konvention dürfen wir in der firma keine right-joins verwenden, sondern müssen das statement unkehren... na ja, eigentlich mag ich codekonventionen gar nicht!! :noe🙂

die primäre frage war diese:

"jemand hat mir gesagt, dass es bei sql-join's relevant ist wie die reihenfolge der "operanden" beim vergleichsoperator definiert werden. als test-db habe ich die "credit"-db von sql server genommen:"

SELECT * FROM member mbr LEFT JOIN payment pmt ON (pmt.member_no = mbr.member_no)

müsste folgedessen was anderes machen als

SELECT * FROM member mbr LEFT JOIN payment pmt ON (mbr.member_no = pmt.member_no)


ich kann mir aber kaum vorstellen dass das stimmt... jemand behauptet das in unserer firma stur bei left- (und auch right-) joins mache dies einen unterschied...?


p.s.: outer join habe ich in meinem ganzen leben auch noch nie gebraucht. wohl "alles was nicht gemeinsam ist" oder so ;-)
 
Zuletzt bearbeitet:
was schreibe ich für schräges zeug wenn ich im stress bin? ;-)
->
"und: bei einem "OUTER JOIN" ist es irrelevant welche tabelle beim "SELECT" und welche beim "JOIN" angegeben wird, wahrscheinlich auch beim "OUTER JOIN"...? sehe ich das richtig?"


sollte heissen:

und: bei einem "INNER JOIN" ist es irrelevant welche tabelle beim "SELECT" und welche beim "JOIN" angegeben wird, wahrscheinlich auch beim "OUTER JOIN"...? sehe ich das richtig?


ein schönes wochenende!
 
die primäre frage war diese:

SELECT * FROM member mbr LEFT JOIN payment pmt ON (pmt.member_no = mbr.member_no)

müsste folgedessen was anderes machen als

SELECT * FROM member mbr LEFT JOIN payment pmt ON (mbr.member_no = pmt.member_no)


ich kann mir aber kaum vorstellen dass das stimmt... jemand behauptet das in unserer firma stur bei left- (und auch right-) joins mache dies einen unterschied...?

Alles richtig. Die Reihenfolge in der Condition ist egal. Gleich ist Gleich. Gleichung halt.

Entscheidend ist das die Reihenfolge beim Join.

Code:
member left join payment
liefert alle aus member mit nulls in payment, wenn in payment keiner ist, für den die Condition zutrifft.

Und
Code:
payment left join member
liefert alle aus payment mit nulls in member.

Letzteres ist der Right-Join von ersterem.
 

Neue Themen


Zurück
Oben