Oracle 数据库列定义不明确/标识符无效
Posted
技术标签:
【中文标题】Oracle 数据库列定义不明确/标识符无效【英文标题】:Oracle database column ambiguously defined / invalid identifier 【发布时间】:2019-07-30 09:39:39 【问题描述】:我尝试编写 SQL 语句以从某些表中进行选择。但是当我运行它时,我得到一个错误,我不知道如何修复它。
当我从vertrag
中选择并加入pgrdat
、abrkreis
、mandant
和komm_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.man
和 vertrag.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】:
问题在于混合using
和on
连接语法。您没有尝试过第三种变体:
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 数据库列定义不明确/标识符无效的主要内容,如果未能解决你的问题,请参考以下文章