2014-02-25 44 views
0

如你所知,如果我们选择了两个表,而我们有相同的列名,我们得到如下错误:模棱两可的列名:为什么在某些情况下模糊不清?

'Ambiguous column name '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小提琴则返回错误都SQL Server 2008和SQL Server上的2012

有谁知道为什么在何种情况下上面的查询仍返回错误或

我的猜测是这是SQL Server上的版本或设置问题。

注意:链接的副本确实解决了我的问题。兼容性级别设置为80.将其更改为100可解决问题。

+0

@SynerCoder请仔细看了一遍我的问题。 –

+0

这部分是否正确:FROM Table1 t1 JOIN Table1 ON Table2 t2?故意将Table1与Table1连接起来吗? – Ziouas

+0

@Ziouas啊不,谢谢。我只是想展示我的问题 –

回答

8

你会得到这个错误当你的SELECT,JOIN ON,WHERE,GROUP,HAVING没有完全限定列AND有超过1列的名称,你有JOIN。

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

我已经知道了。但是在SQL Server 2008 R2中,上面的语句可以工作(!!!)为什么? –

+1

由于您的SELECT具有NAME,因此您可以使用ALIAS ORDER BY,以便在SELECT中找到名称,除非您特别指明TABLE前缀,否则它将使用它。 –

+0

但是t1.Name不是别名,它只是列的名称,所以在这里不能保留 – NickyvV

3

ORDER BY作为SQL语句操作顺序中的最后一步进行处理;请参阅http://www.bennadel.com/blog/70-SQL-Query-Order-of-Operations.htm以获得更好的解释。

SQL语句会按照下列顺序处理:

  1. FROM子句
  2. WHERE子句
  3. GROUP BY子句
  4. HAVING子句
  5. SELECT子句
  6. ORDER BY子句

这意味着,在SELECT语句的时间内解决了歧义问题,因此ORDER BY子句引用了SELECT语句。如果在此之前的任何时候语句不明确,将会抛出错误。

+0

这不是完全正确的,我相信,因为你可以有不同的列在SELECT语句中具有相同的ALIAS – NickyvV

+0

@NickyvV在这种情况下,你会得到不明确的列错误(对于ORDER BY子句中的阿米巴性):** [ SQL-Fiddle](http://sqlfiddle.com/#!6/611b7/1)** –

+1

@ypercube是的,那是我的观点.. :) – NickyvV

相关问题