简体   繁体   English

Oracle数据库列模棱两可定义/无效标识符

[英]Oracle database column ambiguously defined / invalid identifier

I've tried to write a SQL statement to select from some tables. 我试图编写一条SQL语句以从某些表中进行选择。 But when I run it, I get an error, and I don't know how to fix it. 但是,当我运行它时,出现错误,并且我不知道如何解决它。

When I just select from vertrag and join pgrdat , abrkreis , mandant and komm_dat , everything works fine. 当我从vertrag选择并加入pgrdatabrkreismandantkomm_dat ,一切正常。

However, when I try to add literal into the joins, I get the following error: 但是,当我尝试将literal添加到联接中时,出现以下错误:

ORA-00904: "VERTRAG"."MAN" invalid identifier ORA-00904:“ VERTRAG”。“ MAN”无效的标识符
on (left join literal on literal.lit_kzl = pgrdat.beruftit and literal.man = vertrag.man) 启用(在literal.lit_kzl = pgrdat.beruftit和literal.man = vertrag.man上的左连接文字)

or 要么

ORA-00918: column ambiguously defined ORA-00918:列定义不明确
on (left join Literal on Literal.LIT_KZL=pgrdat.BERUFTIT and Literal.man=man) 启用(在Literal.LIT_KZL = pgrdat.BERUFTIT和Literal.man = man上左加入Literal)

literal.man and vertrag.man both exist. literal.manvertrag.man都存在。

Here's my SQL: 这是我的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));

The problem is with mixing using and on join syntax. 问题是混合using ,并on连接语法。 There is a third variant you didn't try: 您没有尝试过的第三种变体:

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

which gets 得到

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

You can't use the unqualified man because it's ambiguous (appearing in several tables); 您不能使用不合格的man因为它模棱两可(出现在多个表中); you can't use a qualifier because it's been used in earlier using() clauses. 您不能使用限定符,因为在较早的using()子句中已经使用了限定符。

If it was an inner join you could change that Literal join to using (man) and move the lit_kzl check to the where clause, but as it's an outer join that won't work (or at least, would force it back to being an inner join). 如果是内部lit_kzl ,则可以将Literal lit_kzl更改为using (man)并将lit_kzl检查移至where子句,但由于它是外部lit_kzl ,因此不起作用(或者至少会迫使其恢复为内部联接)。

You probably need to change all the other using clauses to on , unfortunately: 不幸的on ,您可能需要将所有其他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 ...

I've moved and Literal.LIT_ART='BERUFTIT' from the where clause into the join condition, as that would also have forced that outer join to become an inner join again. 我已经将and Literal.LIT_ART='BERUFTIT'where子句移到了and Literal.LIT_ART='BERUFTIT'条件中,因为那也将迫使外部and Literal.LIT_ART='BERUFTIT'再次成为内部and Literal.LIT_ART='BERUFTIT'

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM