Mischen von impliziten und expliziten JOINs

8

Ich habe ein Problem damit, dass Hibernate ungültiges SQL generiert. Insbesondere das Mischen und Anpassen von impliziten und expliziten Joins. Dies scheint ein offener Fehler zu sein.

Ich bin mir jedoch nicht sicher warum das ist ungültige SQL. Ich habe ein kleines Spielzeugbeispiel gefunden, das dieselbe Syntaxausnahme erzeugt.

Schema

%Vor%

Daten

%Vor%

Arbeits-SQL

Diese beiden Abfragen funktionieren. Ich weiß, dass es ein kartesisches Produkt gibt; das ist beabsichtigt.

Explizite Verbindung:

%Vor%

Implizite JOIN:

%Vor%

Ungültiges SQL

Diese Abfrage funktioniert NICHT bei MSSQL 2000/2008 oder MySQL:

%Vor%

In MS2000 bekomme ich den Fehler:

  

Das Spaltenpräfix 'e1' stimmt nicht überein   mit einem Tabellennamen oder Aliasnamen verwendet   in der Abfrage.

In MySQL lautet der Fehler:

  

Unbekannte Spalte 'e1.managerEmployeeID'   in 'on-Klausel'.

Frage (n)

  1. Warum ist diese Syntax ungültig?
  2. Bonus: Gibt es eine Möglichkeit, Hibernate zu zwingen, nur explizite JOINs zu verwenden?
Chase Seibert 17.04.2009, 18:06
quelle

3 Antworten

12

Dies führt zu einem Fehler, da gemäß dem SQL-Standard das Schlüsselwort JOIN einen höheren Vorrang hat als das Komma. Der kritische Punkt ist, dass Tabellenaliase nicht verwendbar sind, bis nachdem die entsprechende Tabelle in der FROM -Klausel ausgewertet wurde.

Wenn Sie also e1 in Ihrem JOIN...ON -Ausdruck referenzieren, ist e1 noch nicht vorhanden.

Bitte halte dich bereit, während ich Hibernate recherchiere und finde heraus, ob du es überreden kannst, in allen Fällen JOIN zu verwenden.

Hmm. Alles auf Hibernate.org scheint auf jboss.org umgeleitet zu werden. Also keine Möglichkeit, die HQL-Dokumentation online zu lesen. Ich bin mir sicher, dass sie herausfinden werden, wie ihr Name schließlich dient.

    
Bill Karwin 17.04.2009, 18:18
quelle
0

PostgreSQL gibt auch einen Fehler:

%Vor%

Ich denke, das Problem ist, dass wenn Sie zwei Tabellen a und b (e2 und e1Manager in diesem Fall) verbinden, können Sie nur diese beiden Tabellen in der "ON" -Klausel verweisen. Sie können also in dieser ON-Klausel auf e2 und e1Manager verweisen, aber nicht auf e1.

Ich denke, das geht so weit, dass Sie, wenn Sie eine Kette von "JOIN" -Anweisungen haben, in "ON" -Klauseln auf andere Tabellen in derselben Kette verweisen können, aber kein ",". So etwas wie 'ein JOIN b ON a.a_id = b.a_id JOIN c ON c.b_id = b.b_id UND c.a_id = a.a_id "ist erlaubt.

Was ist der HQL, den Sie verwenden, um dieses SQL zu erstellen? Etwas wie "wähle e1.name, e2.name, e1.manager.name von Employee e1, Employee e2"?

    
araqnid 17.04.2009 18:19
quelle
0

Dies könnte ein bisschen vom Thema abweichen, da es sich nicht um den Winterschlaf handelt, sondern um den Kommentar von Bill Karwin < Ich öffnete wirklich meine Augen. Anstatt zuerst den impliziten Join zu schreiben, müssen Sie zuerst den expliziten Join durchführen. Diese Syntax ist besonders interessant, wenn Sie mehrere implizite Joins haben.

Überprüfen Sie das folgende Beispiel in MS SQL. Nicht alle Kontakte haben einen Ländercode definiert, aber alle Kontakte haben ein Attribut val, das in der Tabelle Tbl nachgeschlagen wird. Also die intuitive Lösung wird nicht funktionieren:

%Vor%

Stattdessen möchten Sie vielleicht lieber die folgende Syntax verwenden:

%Vor%     
Damian Vogel 22.03.2013 13:01
quelle