2009-01-19 6 views
8

napisałem Wyrażenie SQL Oracle takiego:Mieszanie „USING” i „on” w Oracle ANSI dołączyć

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) 

Kiedy próbuję go uruchomić, Oracle zgłasza błąd w zgodzie z „ON” ja -join mówiąc: "ORA-25154: część kolumny klauzuli USING nie może mieć kwalifikatora".

Jeśli pominę kwalifikator "am", będzie to oznaczać: "ORA-00918: kolumna niejednoznacznie zdefiniowana".

Jaki jest najlepszy sposób rozwiązania tego problemu?

Odpowiedz

13

Komunikat o błędzie jest (niespodzianka!) Informujący dokładnie o problemie. Po użyciu klauzuli USING dla konkretnej kolumny nie można użyć kwalifikatora kolumny/aliasu tabeli dla tej nazwy kolumny w żadnej innej części zapytania. Jedynym sposobem, aby rozwiązać ten jest aby nie używać klauzuli UŻYWAĆ nigdzie w zapytaniu, ponieważ trzeba mieć kwalifikator na stan sekund dołączyć:

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

Czy możesz podać powód do tego: "Kiedy użyjesz klauzuli USING dla konkretnej kolumny, nie możesz użyć kwalifikatora kolumny/aliasu tabeli dla tej nazwy kolumny w jakiejkolwiek innej części twojego zapytania."? Wygląda jak głupie ograniczenie i unieważnia samo istnienie UŻYCIA. – TWiStErRob

+0

To było tak długo, że nie mam pod ręką odniesienia. Jeśli jednak spróbujesz, zobaczysz, że to prawda (przynajmniej w 10g). IMO, klauzula USING jest całkowicie bezużyteczna. – DCookie

8

Moja ulubiona to nigdy nie używać USING; zawsze używaj ON. Bardzo podoba mi się mój SQL, a klauzula USING czuje, że moim zdaniem usunięto jeden krok.

W tym przypadku idzie o błąd, bo trzeba account_no w mc_current_view, account_master i ml_client_account więc rzeczywista przystąpić nie może zostać rozwiązany. Mam nadzieję że to pomoże.

0

Using jest czystsze (IMO), ale nadal jest pożądane zewnętrznie refererence pola Dołącz jako przykład w org lub przykład takiego:

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); 

to daje złą odpowiedź, ponieważ join_id w podzapytaniu implikuje C.join_id (pasujący wszystkie rekordy) niż A lub B. Być może najlepszym sposobem rozwiązania problemu może być tylko wyraźne odniesienie do używania, posiadanie tego, co najlepsze z obu światów. Wydaje się, że jest potrzeba z powodu takich przypadków.