如您所知,如果我们选择两个表而我们具有相同的列名,则会收到错误:
'不明确的列名'ColumnName''
我已经知道设置别名可以解决此问题。
但是,如果SELECT语句中列的名称不,则它适用于SQL Server 2008 R2(在我的数据库中)。兼容级别设置为100。
所以下面的陈述有效:
SELECT t1.ID
FROM Table1 t1
JOIN Table2 t2 ON (t2.ID = t1.ID)
ORDER BY ID
但显然在其他情况下,上述声明确实会返回错误(我知道这是因为它发生在客户的网站上)。同样在SQL Fiddle上,它在SQL Server 2008和SQL Server 2012上都返回错误。
有人知道为什么或在哪种情况下上述查询仍会返回错误?
我的猜测是SQL Server上的版本或设置问题。
注意:链接的副本确实解决了我的问题。兼容级别设置为80.将其更改为100可解决问题。
答案 0 :(得分:8)
除非您的SELECT,JOIN ON,WHERE,GROUP,HAVING没有完全限定列 AND ,否则您将收到此错误。您已加入的名称超过1列。< / p>
ORDER BY Name示例有效,因为ORDER BY允许您使用SELECT中列的名称,例如,这可以在 ORDER BY 中使用,但不能在SQL语句中的任何其他位置使用
SELECT t1.ID, t1.Name AS [CrazyName]
FROM Table1 t1
JOIN Table1
ON Table2 t2 (t2.ID = t1.ID)
ORDER BY [CrazyName]
答案 1 :(得分:3)
ORDER BY作为SQL语句的操作顺序的最后一步处理;请参阅http://www.bennadel.com/blog/70-SQL-Query-Order-of-Operations.htm以获得更好的解释。
按以下顺序处理SQL语句:
这意味着歧义已在SELECT语句时解决,因此ORDER BY子句引用SELECT语句。如果该语句在此之前的任何时候都不明确,则会引发错误。
答案 2 :(得分:0)
如果你看一下查询的逻辑执行,请在最后阶段ORDER BY我们。因此,ORDER BY采用默认情况下选择中出现的列名/别名