![]() |
Datenbank: Oracle • Version: 11g • Zugriff über: Oracle SQL Developer
Eingeschobener Join
Guten Morgen,
ich bin gerade auf eine Syntax-Form des Joins gestoßen, die mir unbekannt ist.
Code:
Dieser eingeschobene Join bereitet mir Probleme. Aufgrund der Ausgabe habe ich das Query jetzt so umgestellt:
select * from A a
left join B b join C c on c.key = a.key on b.key = a.key;
Code:
Das scheint in diesem Fall auch die gleiche Ausgabe zu erzeugen.
select * from A a
left join B b on b.key = a.key left join C c on c.key = a.key; Sind die beiden Queries gleich? Und welche Version ist geläufiger? Grüße win32 |
AW: Eingeschobener Join
Hi,
Also ich kannte diese erste Version bisher nicht und war ganz erstaunt als es funktioniert hat als ich es grad ausprobiert hab. Es scheint so als wären die beiden SQLs äquivalent.. Geläufiger ist auf jeden Fall die 2. Version! Ich hab mich mit der ersten jetzt grad nicht intensiv beschäftigt aber rein von der Syntax kommt die mir sehr komisch vor... |
AW: Eingeschobener Join
Du hast in Deinen beiden Beispielen einen JOIN durch einen LEFT JOIN ersetzt. Dass beide das gleiche Ergebnis zeigen, kann (bei jeder Join Form) auch an der Beschaffenheit der Daten liegen. Also Vorsicht.
Ich kannte und benutze die erste Form auch nicht. Ohne mir jetzt das Handbuch zu nehmen, halte ich das eher für eine optische Variante, die der Lesbarkeit dienen soll. |
AW: Eingeschobener Join
Vielleicht bekommt der eingeschobene Join ja automatisch noch das "Left" des übergeordneten Joins ab.
Habs aber nicht ausprobiert. Also der Lesbarkeit dient das ganz sicher nicht. Das ist doch 1000x unübersichtlicher und verwirrender als einfach 2 einfache (Left) Joins untereinander... |
AW: Eingeschobener Join
@Neutral General: Mir scheint es auch so, als seien sie äquivalent. Jedoch würde ich dies gerne bestätigt haben.
@jobo: Genau, ich wollte mich jetzt nicht auf ein einzelnes Query verlassen. Es ist wichtig, dass im zweiten Beispiel beides left joins sind, da sonst das Ergebnis abweicht. |
AW: Eingeschobener Join
Dann empfehle ich Dir doch das Handbuch :)
|
AW: Eingeschobener Join
Das ist so wie mit der Addition bzw. hier ist es ja Mengenlehre (Vereinigung) und dem Distributivgesetz. Hier das Ganze mit (impliziten) Klammern:
Code:
"B join C on ..." ist eine Tabelle und die kann mit jeder anderen Tabelle verknüpft werden.
select * from A a
left join ( B b join C c on c.key = a.key ) on b.key = a.key; Was mich hier aber wundert ist, das Du das join mit einer nicht in der (impliziten) Klammer befindlichen Tabelle machen kannst. Mir scheint, hier hast Du zu sehr vereinfacht, denn dein Beispiel funktioniert bei MSSQL so nicht (weil 'A' nicht in der impliziten Klammer steht). Ich würde mich wundern, wenn es bei Oracle genau so geht. |
AW: Eingeschobener Join
Code:
Irgendwie komisch finde ich hier, das im Inneren Join auch auf a.key verglichen wird. Wenn da c.key = b.key stünde, fänd ich das logischer.
select * from A a
left join ( B b join C c on c.key = a.key ) on b.key = a.key; Edit: Das ist wahrschlich dasselbe was Iwo Asnet mit seinem letzten Satz sagt, oder? |
AW: Eingeschobener Join
Zitat:
|
AW: Eingeschobener Join
Zitat:
Bei mir funktioniert der dargestellte Join aus dem Eingangspost nicht und ich frag mich, wie man da von "verschiedenen" Ergebnissen sprechen kann. Okay, ora-12345 ist ja im weitesten Sinn auch ein Ergebnis.
SQL-Code:
Iwo Asnet lag also sehr richtig.
C:\Users\jov4>sqlplus jo@db
SQL*Plus: Release 11.2.0.1.0 Production on Di Feb 14 21:38:43 2012 Copyright (c) 1982, 2010, Oracle. All rights reserved. Kennwort eingeben: Verbunden mit: Oracle Database 11g Release 11.2.0.1.0 - 64bit Production SQL> create table A (key number(5)); Tabelle wurde erstellt. SQL> create table B (key number(5)); Tabelle wurde erstellt. SQL> create table C (key number(5)); Tabelle wurde erstellt. SQL> SQL> SELECT * from A; Es wurden keine Zeilen ausgewõhlt SQL> SELECT * from B; Es wurden keine Zeilen ausgewõhlt SQL> SELECT * from C; Es wurden keine Zeilen ausgewõhlt SQL> SQL> select * from A a 2 left join B b 3 join C c on c.key = a.key 4 on b.key = a.key; join C c on c.key = a.key * FEHLER in Zeile 3: ORA-00904: "A"."KEY": ung³ltiger Bezeichner SQL> Entweder hat win32.api eine 11 beta oder es ist ein klassischer Fall von Fehler bei der Selbstzensur. Kann ja passieren. |
AW: Eingeschobener Join
Ihr habt Recht, ich habe einen kleinen Tippfehler gemacht:
SQL-Code:
@Iwo Asnet: Danke für die Erklärung mit der Mengenlehre, mit der Explizit hingeschriebenen Klammer wird dies auch sofort deutlich.
select * from A a
left join B b ( join C c on c.key = b.key --join C c on c.key = a.key ) on b.key = a.key; |
AW: Eingeschobener Join
Ist denn ein Join dasselbe wie ein Left Join?
Wenn nicht, wage ich mal zu behaupten, das die Ergebnismenge nicht gleich sein muss, wie bei der Version mit den zwei Left Joins, da die eingeschobene Variante evtl. weniger zurückliefert als nur B. Kann aber auch sein, dass ich da gerade zusehr um die Ecke denke |
AW: Eingeschobener Join
Zitat:
|
AW: Eingeschobener Join
Nein, es ist nicht das gleiche.
![]() ![]() |
AW: Eingeschobener Join
Mein ich doch. Dann müsste doch auch meine These Stimmen, dass:
SQL-Code:
nicht zwingend dasselbe Ergebnis liefert wie
select * from A a
left join B b ( join C c on c.key = b.key --join C c on c.key = a.key ) on b.key = a.key;
SQL-Code:
Das zweite liefert alles von A und dazu alles von B was zu A passt und dazu alles von C was zu A passt.
select * from A a
left join B b on b.key = a.key left join C c on c.key = a.key; Das erste liefert alles von A und dazu alles von B und C, wo C zu B passt. Dadurch könnten doch zuvor schon zu A passende Daten von B verloren gehen, da sie nicht zu C passen. |
AW: Eingeschobener Join
Code:
Getippt und nicht getestet (bin kein RDMBS)
select * from A a
left join (B b join C c on c.key = b.key) on b.key = a.key; A = 1,2,3 B = 3,4,5 C = 2,6,7 bc = B join C = () A left join bc = (1-x-x, 2-x-x, 3-x-x) select * from A a left join B b on b.key = a.key left join C c on c.key = a.key; ab = A left join B = (1-x,2-x,3-3) ab left join C = (1-x-x, 2-x-2, 3-3-x) Die Anzahl der Zeilen ist die Gleiche, aber nicht der Inhalt der Zeilen. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz