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
子句中使用过时的隐式连接。