“列模糊定义”错误

时间:2013-09-09 06:54:39

标签: sql oracle name-collision

我有这样的查询:

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:列模糊定义

这是最好的方法吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

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

select *意味着你想要一切,而不是过分担心它在结果集中的位置。如果你做了关心,你就会明确地列出这些列。在极少数情况下,您实际上应该使用select *

答案 2 :(得分: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
相关问题