Я написал такое выражение 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» самосоединения, говоря: «ORA-25154: часть столбца в предложении USING не может иметь квалификатор».
Если я опущу квалификатор «am», будет сказано: «ORA-00918: столбец определен неоднозначно».
Как лучше всего решить эту проблему?


Я предпочитаю никогда не использовать С ИСПОЛЬЗОВАНИЕМ; всегда используйте НА. Я предпочитаю, чтобы мой SQL был очень явным, и, на мой взгляд, предложение С ИСПОЛЬЗОВАНИЕМ кажется удаленным на один шаг.
В этом случае ошибка возникает из-за того, что у вас есть account_no в mc_current_view, account_master и ml_client_account, поэтому фактическое соединение не может быть разрешено. Надеюсь это поможет.
Сообщение об ошибке на самом деле (сюрприз!) Сообщает вам, в чем именно проблема. После того, как вы используете предложение 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);
Прошло так много времени, у меня нет справки под рукой. Однако, если вы попробуете, вы увидите, что это правда (по крайней мере, через 10 г). ИМО, предложение USING совершенно бесполезно.
Использование более чистое (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. Возможно, лучшим способом решения может быть просто разрешить явные ссылки с использованием, имея лучшее из обоих миров. Похоже, что в таких случаях есть необходимость.
Не могли бы вы дать ссылку на это: «Если вы используете предложение USING для определенного столбца, вы не можете использовать квалификатор столбца / псевдоним таблицы для этого имени столбца в любой другой части вашего запроса»? Это похоже на глупое ограничение и отменяет единственное существование USING.