Смешивание "USING" и " ON " в Oracle ANSI join

Я написал такое выражение Oracle SQL:

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)

когда я пытаюсь запустить его, Oracle выдает ошибку в строке с" ON " self-join, говоря:"ORA-25154: часть столбца предложения USING не может иметь квалификатора".

если я опускаю квалификатор "am", он говорит:"ORA-00918: столбец неоднозначно определен".

каков наилучший способ решить эту проблему?

3 ответов


сообщение об ошибке на самом деле (сюрприз! рассказываю, в чем именно проблема. После использования предложения USING для определенного столбца нельзя использовать квалификатор столбца / псевдоним таблицы для этого имени столбца в любой другой части запроса. Единственный способ решить эту проблему - не использовать предложение USING в любом месте вашего запроса, так как у вас должен быть квалификатор для второго условия соединения:

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

мое предпочтение никогда не использовать используя; всегда используйте ON. Мне нравится, чтобы мой SQL был очень явным и используя пункт чувствует, что один шаг удален, на мой взгляд.

в этом случае ошибка возникает, потому что у вас есть account_no на mc_current_view, account_master и ml_client_account таким образом, фактическое соединение не может быть разрешено. Надеюсь, это поможет.


использование чище (imo), но по-прежнему желательно внешне ссылаться на поля соединения, как в Примере org или в Примере, подобном этому:

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

Он дает неправильный ответ, потому что join_id в подзапросе подразумевает C. join_id (соответствующий всем записям), а не A или B. возможно, лучший способ решить может быть просто разрешить явные ссылки с использованием, имея лучшее из обоих миров. Похоже, в таких случаях есть необходимость.