Oracle 数据库列定义不明确/标识符无效

Posted

技术标签:

【中文标题】Oracle 数据库列定义不明确/标识符无效【英文标题】:Oracle database column ambiguously defined / invalid identifier 【发布时间】:2019-07-30 09:39:39 【问题描述】:

我尝试编写 SQL 语句以从某些表中进行选择。但是当我运行它时,我得到一个错误,我不知道如何修复它。

当我从vertrag 中选择并加入pgrdatabrkreismandantkomm_dat 时,一切正常。

但是,当我尝试将 literal 添加到联接中时,出现以下错误:

ORA-00904:“VERTRAG”.“MAN”标识符无效 on(literal.lit_kzl = pgrdat.beruftit 和 literal.man = vertrag.man 的左连接文字)

ORA-00918:列定义不明确 on(左连接 Literal on Literal.LIT_KZL=pgrdat.BERUFTIT 和 Literal.man=man)

literal.manvertrag.man 都存在。

这是我的 SQL:

SELECT man,
       ak,
       pnr,
       vertrag.vertnr,
       vertrag.eintrt2,
       vertrag.ma_ab,
       vertrag.verbegin,
       vertrag.ver_ab,
       vertrag.ver_bis,
       vertrag.verende,
       vertrag.enlogru,
       pgrdat.spr,
       pgrdat.anrede,
       pgrdat.auswnr,
       pgrdat.beruftit,
       pgrdat.daschudat,
       pgrdat.fax,
       pgrdat.gebdat,
       pgrdat.gebname,
       pgrdat.gebort,
       pgrdat.geschl,
       pgrdat.lnd,
       pgrdat.miname,
       pgrdat.namevor,
       pgrdat.namezus,
       pgrdat.naname,
       pgrdat.ort,
       pgrdat.plz,
       pgrdat.plzfach,
       pgrdat.postfach,
       pgrdat.pst_ab,
       pgrdat.pst_bis,
       pgrdat.staat,
       pgrdat.staat2,
       pgrdat.strasse,
       pgrdat.telgesch,
       pgrdat.telprivat,
       pgrdat.titel,
       pgrdat.vorname,
       pgrdat.empfaenger,
       pgrdat.taetint,
       pgrdat.zimmer,
       pgrdat.sachbegrp,
       pgrdat.logasach,
       pgrdat.stellung,
       pgrdat.logasach2,
       pgrdat.sachbegrp2,
       abrkreis.ak_bez,
       abrkreis.ak_kurz,
       abrkreis.ak_ort,
       abrkreis.ak_plz,
       abrkreis.ak_fax,
       abrkreis.ak_plzfach,
       abrkreis.ak_postfach,
       abrkreis.ak_strasse,
       abrkreis.ak_telefon,
       abrkreis.ak_text,
       mandant.man_bez,
       mandant.man_fax,
       mandant.man_firma,
       mandant.man_kurz,
       mandant.man_ort,
       mandant.man_plzfach,
       mandant.man_plzstr,
       mandant.man_postfach,
       mandant.man_st_nr,
       mandant.man_strasse,
       mandant.man_telefon,
       komm_dat.km_art,
       komm_dat.km_ab,
       komm_dat.km_bis,
       komm_dat.km_bem,
       literal.lit_txt
FROM   vertrag
JOIN   pgrdat
USING  (man, ak, pnr)
JOIN   abrkreis
USING  (man, ak)
JOIN   mandant
USING  (man)
LEFT   JOIN komm_dat
USING  (man, ak, pnr)
LEFT   JOIN literal
ON     literal.lit_kzl = pgrdat.beruftit
AND    literal.man = man
WHERE  superman IN ('41900', '41901', '41902', '41903')
AND    literal.lit_art = 'BERUFTIT'
AND    ver_ab <= trunc(SYSDATE)
AND    pgrdat.pst_ab <= trunc(SYSDATE)
AND    ((ver_bis >= trunc(SYSDATE) AND pgrdat.pst_bis >= trunc(SYSDATE)) OR (ver_bis IS NULL AND pgrdat.pst_bis IS NULL));

【问题讨论】:

您必须明确指出连接条件and Literal.man=man 中的列man 来自哪个表,因为可能有几个 当我在literal.lit_kzl = pgrdat.beruftit 和literal.man = vertrag.man 上写“left join literal”时 ORA-00904: “VERTRAG”.“MAN” 标识符无效 【参考方案1】:

问题在于混合usingon 连接语法。您没有尝试过第三种变体:

left join Literal on Literal.LIT_KZL=pgrdat.BERUFTIT and Literal.man=komm_dat.man

得到

ORA-25154: column part of USING clause cannot have qualifier

您不能使用不合格的man,因为它不明确(出现在多个表格中);您不能使用限定符,因为它已在早期的 using() 子句中使用过。

如果它是一个内连接,您可以将 Literal 连接更改为 using (man) 并将 lit_kzl 检查移动到 where 子句,但因为它是一个不起作用的外连接(或至少, 会强制它回到内部连接)。

很遗憾,您可能需要将所有其他 using 子句更改为 on

...
from vertrag
join pgrdat on pgrdat.man = vertrag.man and pgrdat.ak = vertrag.ak and pgrdat.pnr = vertrag.pnr
join abrkreis on abrkreis.man = vertrag.man and abrkreis.ak = vertrag.ak
join mandant on mandant.man = vertrag.man
left join komm_dat on komm_dat.man = vertrag.man and komm_dat.ak = vertrag.ak and komm_dat.pnr = vertrag.pnr
left join Literal on Literal.LIT_KZL=pgrdat.BERUFTIT and Literal.man=vertrag.man
and Literal.LIT_ART='BERUFTIT'
where ...

我已将 and Literal.LIT_ART='BERUFTIT'where 子句移到连接条件中,因为这也会迫使外连接再次变为内连接。

【讨论】:

现在我得到:ORA-00904:“VERTAG”。“MAN”:在线标识符无效:在 vertag.man=pgrdat.man 和 vertrag.ak = pgrdat.ak 和 vertrag 上加入 pgrdat。 pnr=pgrdat.pnr 那是因为它应该是vertrag.man,而不是vertag.man

以上是关于Oracle 数据库列定义不明确/标识符无效的主要内容,如果未能解决你的问题,请参考以下文章

Oracle,无效标识符错误

尽管列在表中,但标识符无效

Hibernate 自动更新表出错 建表或添加列,提示标识符无效

带有限定标识符的 where 子句中的不明确列

在数据透视期间指定列时标识符无效 - ORA-00904

oracle查看无效标识符