Смешивание "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» самосоединения, говоря: «ORA-25154: часть столбца в предложении USING не может иметь квалификатор».

Если я опущу квалификатор «am», будет сказано: «ORA-00918: столбец определен неоднозначно».

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
8
0
14 591
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я предпочитаю никогда не использовать С ИСПОЛЬЗОВАНИЕМ; всегда используйте НА. Я предпочитаю, чтобы мой 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);

Не могли бы вы дать ссылку на это: «Если вы используете предложение USING для определенного столбца, вы не можете использовать квалификатор столбца / псевдоним таблицы для этого имени столбца в любой другой части вашего запроса»? Это похоже на глупое ограничение и отменяет единственное существование USING.

TWiStErRob 27.08.2013 16:29

Прошло так много времени, у меня нет справки под рукой. Однако, если вы попробуете, вы увидите, что это правда (по крайней мере, через 10 г). ИМО, предложение USING совершенно бесполезно.

DCookie 29.08.2013 04:13

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

Другие вопросы по теме