#sql #oracle #join
#sql #Oracle #Присоединиться
Вопрос:
Обновление: я переключаю ЛЕВОЕ СОЕДИНЕНИЕ на ПОЛНОЕ СОЕДИНЕНИЕ, и оно работает. Однако я слишком новичок в SQL-кодировании, чтобы знать why…so если кто-нибудь знает, пожалуйста, дайте мне знать. Спасибо!
(Я использую Oracle SQL Developer версии 4.0.2.15)
Я не знаю, что я сделал не так, но я не могу заставить это соединение слева работать. Если я использую «Соединение», тогда это работает. Если я поставлю «Левое соединение», я получу сообщение об ошибке:
ORA-00918: столбец неоднозначно определен
00918. 00000 — «столбец неоднозначно определен»
* Причина:
* Действие:
Ошибка возникает вокруг первого левого соединения
Select fa.ABC
From AdminDisplay.AppointmentInfo fa
Left Join (
select info.feFpk as infoFpk
,listagg(info.institution,'/ ') within group (order by rowid) as institution
,listagg(info.fieldofstudy,'/ ') within group (order by rowid) as Undegradmajor
,listagg(info.degreedesc,'/ ') within group (order by rowid) as Undergraddegree
from (select fe.ABC feFpk
,fe.institution
,fe.fieldofstudy
,ld.degreedesc
from MasterDisplay.faceducation fe
join MasterDisplay.lkupdegree ld on ld.degreepk=fe.degreepk
where fe.educationtypepk in ('XXX')) info
group by info.feFpk
) UG on UG.infoFpk=fa.ABC
;
Комментарии:
1. Я сделаю предположение и скажу, что вам нужно быть более конкретным в этом атрибуте: rowid в
order by rowid
2. Одна вещь, которая была бы очень полезна (как для вас, так и для всех, кто отвечает на этот вопрос), — это сократить публикуемый вами SQL, удалив все, что не является существенным для воспроизведения ошибки. Например, нужна ли закомментированная строка для воспроизведения ошибки? Как насчет удаления одного из левых соединений? Или несколько столбцов? Каков абсолютный минимум, который покажет ошибку?
3. Извините… ошибка возникает при первом «соединении слева». Если бы я вместо этого использовал «Join», весь запрос работал бы… это просто не тот результат, который я хочу. Я отредактировал вопрос. Спасибо
4. Это совершенно не связано, но если вы используете «with» вместо встроенных подзапросов, это действительно улучшает читаемость запроса. Мне действительно любопытно, что изменение внутреннего соединения на левое соединение вызывает эту ошибку компиляции. Это не вычисляется.
Ответ №1:
Не совсем уверен, почему переключение с внутреннего соединения на внешнее вызывает ошибку, поскольку она поступает из UG
встроенного представления. Похоже, это может быть ошибка синтаксического анализатора, возможно.
Вы можете избежать ошибки внешнего соединения, просто указав, какая из двух таблиц во info
встроенном представлении предоставляет rowid
, как предположил @Amir:
Left Join (
select info.feFpk as infoFpk
,listagg(info.institution,'/ ') within group (order by fe_rowid) as institution
,listagg(info.fieldofstudy,'/ ') within group (order by fe_rowid) as Undegradmajor
,listagg(info.degreedesc,'/ ') within group (order by fe_rowid) as Undergraddegree
from (select fe.rowid fe_rowid
,fe.ABC feFpk
,fe.institution
,fe.fieldofstudy
,ld.degreedesc
from MasterDisplay.faceducation fe
join MasterDisplay.lkupdegree ld on ld.degreepk=fe.degreepk
where fe.educationtypepk in ('XXX')) info
group by info.feFpk
) UG
Итак, во встроенном представлении я добавил fe.rowid fe_rowid
в качестве дополнительного элемента список выбора; и затем listagg()
вызовы используют этот псевдоним fe_rowid
вместо неоднозначного rowid
.
Использование rowid
для заказа чего-либо немного странно, поскольку на самом деле оно не представляет ничего полезного в данных. Если вы просто выбрали это, потому что вам нужно что-то заказать, тогда вы могли order by null
бы, что также было бы неопределенным; или order by feFpk
что может быть немного более полезным, даже если это синтетический ключ.
Комментарии:
1. Это работает! Спасибо за подробное объяснение. Я также пробовал заказывать по fefPK 🙂