Left Join ORA-00918: ошибка неоднозначного определения столбца

#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 🙂