2009-01-19 11 views
8

ich einen Oracle SQL-Ausdruck wie folgt geschrieben:„mit“ und „ON“ in Oracle ANSI Mixing verbinden

SELECT 
... 
FROM mc_current_view a 
JOIN account_master am USING (account_no) 
JOIN account_master am_loan ON (am.account_no = am_loan.parent_account_no) 
JOIN ml_client_account mca USING (account_no) 

Wenn ich versuche, es zu laufen, Oracle einen Fehler in der Zeile mit „ON“ Selbst wirft -Gehen Sie zu: "ORA-25154: Spaltenabschnitt der USING-Klausel kann kein Qualifikationsmerkmal haben".

Wenn ich das Qualifikationsmerkmal "am" weglasse, heißt es: "ORA-00918: Spalte zweideutig definiert".

Was ist der beste Weg, um dies zu beheben?

Antwort

13

Die Fehlermeldung ist eigentlich (Überraschung!) Ihnen genau zu sagen, was das Problem ist. Sobald Sie die USING-Klausel für eine bestimmte Spalte verwenden, können Sie keinen Spaltenqualifizierer/Tabellenalias für diesen Spaltennamen in einem anderen Teil Ihrer Abfrage verwenden. Der einzige Weg, dies zu lösen, ist nicht die NG-Klausel irgendwo in der Abfrage zu verwenden, da Sie die Qualifikation auf der zweiten Joinbedingung haben müssen:

SELECT 
... 
FROM mc_current_view a 
JOIN account_master am ON (a.account_no = am.account_no) 
JOIN account_master am_loan ON (am.account_no = am_loan.parent_account_no) 
JOIN ml_client_account mca ON (a.account_no = mca.account_no); 
+1

Können Sie bitte einen Hinweis dafür geben: "Sobald Sie die USING-Klausel für eine bestimmte Spalte verwenden, können Sie keinen Spaltenqualifizierer/Tabellenalias für diesen Spaltennamen in einem anderen Teil Ihrer Abfrage verwenden."? Es sieht wie eine dumme Einschränkung aus und macht die einzige Existenz von USING ungültig. – TWiStErRob

+0

Es ist so lange her, dass ich die Referenz nicht zur Hand habe. Wenn Sie es jedoch versuchen, werden Sie sehen, dass es wahr ist (mindestens in 10 g). IMO, die USING-Klausel ist vollkommen nutzlos. – DCookie

8

Meine Präferenz ist nie zu verwenden USING; verwenden Sie immer ON. Ich mag meine SQL, um sehr explizit zu sein und die USING Klausel fühlt sich meiner Meinung nach einen Schritt entfernt.

In diesem Fall wird der Fehler kommt über, weil Sie account_no in mc_current_view haben, account_master und ml_client_account so dass die tatsächliche beitreten kann nicht aufgelöst werden. Hoffe das hilft.

0

Die Verwendung ist Reiniger (imo), aber es ist nach wie vor wünschenswert extern refererence die Felder kommen, wie in der org Beispiel oder ein Beispiel wie folgt aus:

select A.field, 
     B.field, 
     (select count(C.number) 
      from tableC C 
     where C.join_id = join_id -- wrong answer w/o prefix, exception with. 
     ) avg_number 
    from tableA A 
    join tableB B using (join_id); 

Es gibt die falsche Antwort, weil die join_id innerhalb der Unterabfrage C.join_id impliziert eher als A oder B (alle Datensätze passend) Vielleicht ist der beste Weg, um zu lösen, nur explizite Verweise mit zu verwenden, das Beste aus beiden Welten zu haben. Scheint so, als ob es solche Fälle gäbe.