2014-02-25 69 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

相關問題