Смешивание "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. возможно, лучший способ решить может быть просто разрешить явные ссылки с использованием, имея лучшее из обоих миров. Похоже, в таких случаях есть необходимость.