模糊列名称:为什么在某些情况下它不明确?

时间:2014-02-25 15:58:56

标签: sql sql-server

如您所知,如果我们选择两个表而我们具有相同的列名,则会收到错误:

  

'不明确的列名'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可解决问题。

3 个答案:

答案 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语句:

  1. FROM clause
  2. WHERE子句
  3. GROUP BY子句
  4. HAVING条款
  5. SELECT条款
  6. ORDER BY子句
  7. 这意味着歧义已在SELECT语句时解决,因此ORDER BY子句引用SELECT语句。如果该语句在此之前的任何时候都不明确,则会引发错误。

答案 2 :(得分:0)

如果你看一下查询的逻辑执行,请在最后阶段ORDER BY我们。因此,ORDER BY采用默认情况下选择中出现的列名/别名

http://blog.sqlauthority.com/2009/04/06/sql-server-logical-query-processing-phases-order-of-statement-execution/