Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Eingeschobener Join (https://www.delphipraxis.net/166446-eingeschobener-join.html)

Win32.API 14. Feb 2012 08:45

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:
select * from A a
    left join B b
        join C c on c.key = a.key
    on b.key = a.key;
Dieser eingeschobene Join bereitet mir Probleme. Aufgrund der Ausgabe habe ich das Query jetzt so umgestellt:

Code:
select * from A a
    left join B b on b.key = a.key
    left join C c on c.key = a.key;
Das scheint in diesem Fall auch die gleiche Ausgabe zu erzeugen.

Sind die beiden Queries gleich? Und welche Version ist geläufiger?


Grüße
win32

Neutral General 14. Feb 2012 09:12

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...

jobo 14. Feb 2012 09:17

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.

Neutral General 14. Feb 2012 09:24

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...

Win32.API 14. Feb 2012 09:29

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.

jobo 14. Feb 2012 09:35

AW: Eingeschobener Join
 
Dann empfehle ich Dir doch das Handbuch :)

Iwo Asnet 14. Feb 2012 12:54

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:
select * from A a
    left join
        (
        B b join C c on c.key = a.key
        )
    on b.key = a.key;
"B join C on ..." ist eine Tabelle und die kann mit jeder anderen Tabelle verknüpft werden.

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.

Jumpy 14. Feb 2012 13:19

AW: Eingeschobener Join
 
Code:
select * from A a
    left join
        (
        B b join C c on c.key = a.key
        )
    on b.key = a.key;
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.

Edit: Das ist wahrschlich dasselbe was Iwo Asnet mit seinem letzten Satz sagt, oder?

Iwo Asnet 14. Feb 2012 15:02

AW: Eingeschobener Join
 
Zitat:

Zitat von Jumpy (Beitrag 1151033)
Edit: Das ist wahrschlich dasselbe was Iwo Asnet mit seinem letzten Satz sagt, oder?

Nicht nur 'wahrscheinlich' ;-)

jobo 14. Feb 2012 20:51

AW: Eingeschobener Join
 
Zitat:

Zitat von Neutral General (Beitrag 1150969)
..
Also der Lesbarkeit dient das ganz sicher nicht...

Deswegen hab ich ja "soll" geschrieben. Hät ich mal besser im Konjunktiv geschrieben. Ich mag die ANSI Joins nicht (aus Gewohnheit), auch wenn sie eigentlich viel klarer sind. Meist nehm ich das (+) (solange es geht). Aber der Teufel steckt im Detail.
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:
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>
Iwo Asnet lag also sehr richtig.

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 21:18 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz