Смешивание "USING" и "ON" в соединении Oracle ANSI
Я написал выражение 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);
Я предпочитаю никогда не использовать USING; всегда используйте ON. Я хотел бы, чтобы мой SQL был очень явным, и, по моему мнению, предложение USING было бы удалено на один шаг.
В этом случае возникает ошибка, потому что у вас есть 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. Возможно, лучший способ разрешить проблему - это просто разрешить явные ссылки с использованием, имея лучшее из обоих миров. Кажется, есть необходимость из-за подобных случаев.