[英]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
选择并加入pgrdat
, abrkreis
, mandant
和komm_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.man
和vertrag.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.