2

我有一个这样的查询:

SELECT *
  FROM table1 ref1,
       table1 ref2,
       table2 ref3,
       table2 ref4,
       table3
 WHERE ref3.a = ref1.b , 
       ref4.a = ref2.b , 
       ref3.c = f, 
       ref4.c = d

而且效果很好,它为我提供了 1 条记录,其中包含我想要的所有列。

其中两列具有相同的名称,但后者直观地得到扩展名 _1,因此具有该名称的第一列具有名称frubberducks,第二列具有名称frubberducks_1,这很好。我需要一个只给我这两列的查询,所以我尝试了:

SELECT frubberducks
  FROM table1 ref1,
       table1 ref2,
       table2 ref3,
       table2 ref4,
       table3
 WHERE ref3.a = ref1.b , 
       ref4.a = ref2.b ,
       ref3.c = f , 
       ref4.c = d

我得到了错误:

ORA-00918: 列定义不明确

这样做的最佳方法是什么?

4

3 回答 3

4

最好的方法是使用表别名和列别名,如下所示

对于一列:

SELECT ref1.frubberducks
FROM table1 ref1,table1 ref2,table2 ref3,table2 ref4,table3
WHERE ref3.a = ref1.b and ref4.a = ref2.b and ref3.c=f and ref4.c=d

对于具有相同名称的两列:

SELECT ref1.frubberducks,
       ref2.frubberducks
FROM table1 ref1,table1 ref2,table2 ref3,table2 ref4,table3
WHERE ref3.a = ref1.b and ref4.a = ref2.b and ref3.c=f and ref4.c=d

对于具有相同名称和列别名的两列:

SELECT ref1.frubberducks ref1frubberducks,
       ref2.frubberducks ref2frubberducks
FROM table1 ref1,table1 ref2,table2 ref3,table2 ref4,table3
WHERE ref3.a = ref1.b and ref4.a = ref2.b and ref3.c=f and ref4.c=d
于 2013-09-09T06:56:18.020 回答
2

最好的方法是明确的,例如:

SELECT ref1.frubberducks as frubberducks,
       ref3.frubberducks as frubberducks_1 ...

select *意味着您想要所有东西,并且您不会过分担心它在结果集中的位置。如果您确实关心,您将明确列出这些列。无论如何,您应该实际使用的情况很少select *见。

于 2013-09-09T06:57:48.377 回答
1

这是因为如果您指定要返回的列,则必须明确指定它们。

所以它应该看起来像

SELECT ref1.frubberducks, ref2.frubberducks as frubberducks_1
FROM table1 ref1,table1 ref2,table2 ref3,table2 ref4,table3
WHERE ref3.a = ref1.b , ref4.a = ref2.b , ref3.c=f , ref4.c=d
于 2013-09-09T07:00:04.387 回答