2011-11-17 50 views
1

例子查询多个表:SQL“凡存在”与别名

Select id, id_dtm 
From tableA 
Where exists (
Select 1 
From tableB b, tableC c, tableD d 
Where b.id = id 
And b.id_dtm = id_dtm 
And b.id = c.id 
And c.id = d.id); 

上述查询的问题是,所有4个表有一个名为ID和id_dtm列。 当我运行它时,我收到一个错误,说列ORA-00918:列含义不明确

我可以通过在tableA中使用别名来解决问题,但问题是查询是动态生成的。 where exists部分是在其他地方生成的,并且在稍后它合并之前的那一部分,所以我不能像现在这样使用别名。

有没有什么办法可以在where exists子句的tableA中使用id和id_dtm,而不使用tableA的别名?

数据库是Oracle10g的

回答

6

写表名tableA

Select id, id_dtm 
From tableA 
Where exists (
Select 1 
From tableB b, tableC, tableD 
Where tableB.id = tableA.id 
And tableB.id_dtm = tableA.id_dtm 
And tableB.id = tableC.id 
And tableC.id = tableD.id) 
+0

正确的答案,但他明确要求,如果他能做到这一点不使用表A别名。 –

+0

我没有意识到我可以使用表名,所以这应该工作,因为表名将永远是相同的。谢谢! – ziggy

+0

@EricPetroelje:这不使用别名 - 它使用实际的表名称。 –

1

我不知道您的具体设置,但你为什么不能设置在外部表的别名?它不必反映实际使用的表格,只需将其与“外部”或别的东西混为一谈即可。在内部查询中,你已经知道id存在于外部使用的任何表中,所以outer.id可以正常工作。

-1

子查询中涉及tableA(即idid_dtm)的字段也存在于其他表中,因此它们是不明确的。通过在前面那些给tableA别名解决这个问题:

Select A.id, A.id_dtm 
From tableA A 
Where exists (
Select 1 
From tableB b, tableC c, tableD d 
Where b.id = A.id 
And b.id_dtm = A.id_dtm 
And b.id = c.id 
And c.id = d.id); 
+0

添加说明plz –