Autor Beitrag
Kossy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Di 07.08.12 18:04 
Hallo,

Ich habe mal eine Frage zum Inner Join in SQL. Gehen wir einmal davon aus, dass ich einen solchen über drei Tabellen realisieren möchte. Die Tabellen wären:

- Bestellung
- Bestellpositionen
- Artikel

Nun "Joine" ich die Tabelle "Bestellung" mit "Bestellpositionen".

ausblenden C#-Quelltext
1:
2:
3:
SELECT *
FROM Bestellung b INNER JOIN Bestelpositionen bs
  ON b.bestnr = bs.bestnr;


Nun möchte ich aber noch die Artikel "dazujoinen", also:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
SELECT *
FROM Bestellung b INNER JOIN Bestelpositionen bs
  ON b.bestnr = bs.bestnr
  INNER JOIN Artikel a
  ON bs.artnr = a.artnr;


Und genau zu diesem dritten Join habe ich jetzt eine Verständnisfrage. Bezieht dieser sich auf die temporäre Ergebnismenge (die derzeit durch den JOIN im DBMS vorhanden ist) aus
ausblenden C#-Quelltext
1:
2:
Bestellung b INNER JOIN Bestelpositionen bs
  ON b.bestnr = bs.bestnr;


oder bezieht sich der Join auf die gesamten Grunddaten / Rohdaten aus den Datenbanktabellen "Bestellung" und "Bestellpositionen"? Ich meine joine ich bei mehreren INNER JOIN Anweisung immer auf die gerade vorhandenen temporären Daten aus dieser Anweisung mit vielen INNER JOINS (welche ja durch die ON Klausel auch entscheidend mit vorgegeben werden)? Also liefert der JOIN aus "Bestellung" und "Bestellposition" quasi die Datengrundlagen für den dritten JOIN mit der Tabellen Artikel und nicht die gesamten Daten aus den Tabellen "Bestellung" und "Bestellpositionen"?

Ich hoffe es halbwegs verständlich geworden, worauf ich hinaus möchte?

MFG
Kossy
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Di 07.08.12 18:25 
Hallo Kossy,

mathematisch gesehen ist ein JOIN das Kreuzprodukt aller verwendeten Tabellen, d.h. Bestellung x Bestellpositionen x Artikel. Erst durch die JOIN-Bedingung (EQUI-JOIN) wird jedoch eine brauchbare Teilmenge davon ermittelt.
Mehrfach-JOINS werden i.d.R. aber von links nach rechts abgearbeitet, s.a. aktuell.de.selfhtml....el/datenbanken/joins bzw. aktuell.de.selfhtml....ken/joins#innerjoins (sowie den Absatz darüber: "Mehrfachjoins")

Wenn du jedoch noch WHERE-Bedingungen dabei hast, entscheidet das DBMS selbständig, in welcher optimalen Zugriffsweise die Daten geholt werden (anhand von Tabellengröße, Indizes, etc.).

Aber was ist denn deine genaue Intention der Frage?
Kossy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Di 07.08.12 21:20 
Hallo,

ich möchte ein technisches Grundverständnis erlangen. Aber hatte ich jetzt eigentlich recht mit meiner Vermutung, dass die dritte Tabelle Artikel bzw. der dritte Join auf das temporäre Zwischenergebnis aus dem Inner join zwischen Bestellung und Bestellpositionen aufbaut und nicht den nackten Rohdatentabellen. Wirkt die On Klausel quasi wie ein Filter?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mi 08.08.12 10:28 
Ja, genau: der join on Ausdruck ist nur eine andere Schreibweise für eine where-Bedingung (steht ja auch so im verlinkten Artikel ;-)).
Kossy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 53



BeitragVerfasst: Mi 08.08.12 22:18 
Hallo nochmal !

Ich hätte doch noch einmal eine letzte Frage zu dem Thema.

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
mathematisch gesehen ist ein JOIN das Kreuzprodukt aller verwendeten Tabellen, d.h. Bestellung x Bestellpositionen x Artikel


Du sprichst hier von einem JOIN im Allgemeinen. Bezieht sich das auch auf einen INNER JOIN oder eine beliebigen OUTER JOIN? Also wird hier auch "immer" ein Kreuzprodukte gebildet (auch wenn eine ON Klausel noch dazukommt)?

Dazu vielleicht ein SQL Beispiel (mit einer Inline-View innerhalb der From Klausel von mir:

ausblenden C#-Quelltext
1:
2:
3:
4:
SELECT a.Artikelnr, a.Artikelbez, a.VKPreis, a.Gruppe, d.Durchschnitt
FROM Artikel a INNER JOIN (SELECT Gruppe, AVG(vkpreis) AS Durchschnitt
                           FROM artikel) d
     ON a.Gruppe = d.Gruppe;



//OFFTOPIC
Kann eine ON Klausel eigentlich auch mehrere Bedingungen beinhalten (z.B. durch Klammersetzungen und der Verwendung von Operatoren).

Es waren doch noch zwei Fragen, doch nicht nur eine Frage :-)

MFG
Kossy
thepaine91
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 763
Erhaltene Danke: 27

Win XP, Windows 7, (Linux)
D6, D2010, C#, PHP, Java(Android), HTML/Js
BeitragVerfasst: Do 09.08.12 14:58 
Zur 2. Frage ja kann sie:
ausblenden SQL-Anweisung
1:
SELECT * FROM table LEFT JOIN joinedtable ON foo = foo AND (foo2 = foo2 OR foo3 = foo3);					


Zur Frage 1:
OUTER JOIN benutzt sowieso keiner... ;) :D
Und beim RIGHT/INNER JOIN sollte es identisch mit dem LEFT JOIN sein.


Zuletzt bearbeitet von thepaine91 am Do 09.08.12 16:40, insgesamt 1-mal bearbeitet
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 09.08.12 16:17 
Zitat:
Also wird hier auch "immer" ein Kreuzprodukte gebildet (auch wenn eine ON Klausel noch dazukommt)?


Logisch ja. Praktisch vielleicht manchmal auch wenn die Datenbank meint das es so am schnellsten geht. Aber was die genau die das tut hängt von vielen Faktoren ab (Statistiken, Indizes, aktuelle Systemauslastung etc.) und kaum vom konkret benutzten Syntax. Mit SQL beschreibst du nur welche Daten du haben willst aber nicht wie die ermittelt werden. Insofern ist ein Kreuzprodukt auch nur eine rein logische Größe die konkrete Implementierung muss mit dem was wir uns darunter Vorstellen rein gar nichts zu tun haben. Darum kann dir hier eigentlich keiner sagen was da in einem konkreten Fall konkret passiert. Die meisten Datenbanken haben aber ein Feature (Ausführungsplan, Explain Plan oder ähnlich benannt) um dir zu zeigen was sie denn getan haben oder hätten. Denn müsstest du nur lernen zu lesen (Was nicht unbedingt einfach ist). Und dir sollte bewusst sein das 2maliges Ausführen des SQLs zu 2 verschiedenen Ausführungsplänen führen kann.