Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql &引用;列定义含糊不清;错误_Sql_Oracle_Name Collision - Fatal编程技术网

Sql &引用;列定义含糊不清;错误

Sql &引用;列定义含糊不清;错误,sql,oracle,name-collision,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 它工作得很好,它给了我一张我想要的所有栏目的唱片 其中两列的名称相同,但后一列直观地得到扩展

我有这样一个问题:

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,因此第一列的名称为
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:定义不明确的列


最好的方法是什么?

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

对于一列:

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

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

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

select*
意味着您想要所有东西,而不必过分担心它在结果集中的位置。如果你在意的话,你会明确列出这些列。在很少的情况下,您实际上应该使用
select*

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

所以看起来应该是这样的

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

呃,这不是只给你一个
frubberduck
列吗?Parado,你可能想重读这个问题:“我需要一个只给我这两列的查询”。@Parado在这种情况下,逗号一直正确吗?。这是我第一次知道我们可以用逗号代替“and”,但这是一个好的做法吗?还有其他的逗号可以在条件中使用吗?例如,在你的例子中,逗号替换了“或”,是否有什么东西替换了“或”?@Moudiz我错过了:)这不正确,应该是
而不是逗号,谢谢你的评论!frubberducks_1不是实际的列名,它是查询结果中第二个frubberducks字段的自动别名。但当您尝试选择frubberducks时,Oracle无法猜出您的意思,例如ref1.frubberducks或ref2.frubberducks,并抛出一个错误。在列名中使用表别名,一切都可以:)作为旁注:查询在语法上不正确。
WHERE
子句中的条件应使用逻辑运算符组合,而不是逗号
而且效果很好
为什么呢?您还应该开始使用显式
连接
语法,而不是在
where
子句中使用过时的隐式连接。