![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:11 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 by Thomas Breitkreuz