列中含糊不清地定义在oracle中

时间:2014-06-08 18:33:05

标签: sql join ambiguous name-collision

我不是sql专家。我试图在我的oracle sqlplus提示符上运行以下查询

select 0 AS initVal, 
loadTable.amount from 
accountsTable JOIN loadTable ON num=accNum ,
loadTable JOIN loanTable ON loadTable.numSeq=loanTable.numSeq

并收到以下错误

column ambiguously defined, which is pointing to loadTable.amount in select clause.

我能够理解有一个accountsTable JOIN loadTable ON num=accNum loadTable JOIN loanTable ON loadTable.numSeq=loanTable.numSeq的笛卡尔积,之后无法理解从哪个表中选择loadTable.amount,因为两者都有这个专栏。 有没有办法在loadTable.amount上没有指定这两个中间表之间的另一个连接的情况下摆脱这个问题?

1 个答案:

答案 0 :(得分:2)

这是您的查询:

select 0 AS initVal, loadTable.amount
from accountsTable JOIN
     loadTable
     ON num=accNum ,
     loadTable JOIN
     loanTable
     ON loadTable.numSeq=loanTable.numSeq;

您的查询有loadtable两次,我认为您并不打算这样做。而且,最后一个条件是重言式,因为价值来自同一张表。此外,您应该使用缩写的表别名 - 它使查询更容易编写和读取。我认为这更接近你想要做的事情:

select 0 AS initVal, lt.amount
from accountsTable act JOIN
     loadTable lt
     ON act.num = lt.accNum JOIN
     loanTable lot
     ON lt.numSeq = lot.numSeq;

作为一般规则:永远不要在from语句中使用逗号。始终使用相应的join连接表格。

编辑:

如果您认为您的查询“逻辑”正确,则应该放入表别名并具体说明连接:

select 0 AS initVal, lot1.amount
from accountsTable act JOIN
     loadTable lot1
     ON act.num = lot1.accNum CROSS JOIN
     loadTable lot2 JOIN
     loanTable lnt
     ON lot1.numSeq = lot2.numSeq;

这些连接条件对我来说看起来并不敏感,特别是因为查询只从一个表中提取amount,所以第二个表甚至似乎都没有被使用。