【问题标题】:Left Join ORA-00918: column ambiguously defined error左连接 ORA-00918: 列定义不明确错误
【发布时间】:2014-06-25 14:50:25
【问题描述】:

更新:我将 LEFT JOIN 切换为 FULL JOIN 并且它可以工作。 但是,我对 SQL 编码太陌生了,不知道为什么……所以如果有人知道,请告诉我。谢谢!

(我使用的是 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  
    ;  

【问题讨论】:

  • 我猜一下,说你需要更具体的这个属性:rowid in order by rowid
  • 对您和回答此问题的任何人都非常有帮助的一件事是通过删除对于重现错误而言并非必不可少的所有内容来减少您发布的 SQL。例如,重现错误是否需要注释掉的行?删除其中一个左连接怎么样?还是一些列?显示错误的最低限度是多少?
  • 对不起...错误发生在第一个“左连接”中。如果我改用“加入”,则整个查询都可以工作......这不是我想要的结果。我编辑了这个问题。谢谢
  • 这完全不相关,但是如果你使用“with”而不是内联子查询,它确实增加了查询的可读性。我确实很奇怪将内部联接更改为左联接会导致此编译错误。这不计算。

标签: sql oracle join


【解决方案1】:

不太清楚为什么从内部连接切换到外部连接会引发错误,因为它来自 within 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 来订购任何东西有点奇怪,因为它并不能真正代表任何对数据有用的东西。如果您只是因为必须通过 something 订购而选择了它,那么您可以order by null 这也是不确定的;或order by feFpk,即使它是合成密钥,它也可能更有用。

【讨论】:

  • 有效!谢谢你的详细解释。我也试过按 fefPK 订购 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-14
相关资源
最近更新 更多