簡體   English   中英

SQL Select 語句中的歧義列錯誤

[英]Ambiguous Column Error In SQL Select Statement

SELECT IB,* 
FROM SaleOrder 
WHERE IB IS NOT NULL 
ORDER BY IB

錯誤 :

Msg 209, Level 16, State 1, Line 1
不明確的列名“IB”。

有人可以解釋為什么我在 SQL Server 2012 中執行上述 SQL 語句時出錯,而在 SQL Server 2008 中運行良好?

我的猜測是您的 SQL Server 2008 數據庫處於 SQL Server 2000 兼容模式,因為通常它應該返回與您的 2012 實例相同的錯誤

嘗試完全限定查詢中的表名並在具有默認兼容級別的數據庫上下文中(例如在tempdb上下文中)在 SQL Server 2008 中運行它,您可能會看到錯誤。

行為上的差異是設計使然,並在此 Technet 文章中記錄如下(強調):

兼容級別設置為 80

將 ORDER BY 列表中的列引用綁定到 SELECT 列表中定義的列時,列歧義會被忽略,列前綴有時也會被忽略。 這可能會導致結果集以意外的順序返回。

您的表已包含列IBID,因此在ORDER BY子句中,sql server 無法決定要訪問和排序的列、從 * 中獲得的表中的IBID或在SELECT列表開頭指定的 IBIS 列

Select IBID,s.* from SaleHeader s WHERE IBID IS NOT NULL Order BY s.IBID

指定表的別名,如上所示

Select * from SaleHeader WHERE IBID IS NOT NULL Order BY IBID

這是因為IBID列現在在您的結果中出現了兩次。

您應該添加別名或刪除該列。

所以要么這樣:

Select * from SaleHeader WHERE IBID IS NOT NULL Order BY IBID

或者:

Select s.IBID colX,* from SaleHeader s WHERE s.IBID IS NOT NULL Order BY s.IBID

關於“為什么”:

查詢是否完全相同? 也許兩個平台上的解釋器不同。 您對這個查詢的使用有什么不同嗎? (例如,您是單獨運行它還是作為視圖定義運行。這在分析方式上有很大不同)

那是因為您選擇了IBID列兩次。

嘗試:

Select * from SaleHeader WHERE IBID IS NOT NULL Order BY IBID

您的表已經有該列。 如果在一個查詢中使用 2 次列,則 sql server 需要指定要訪問的表列。 按順序使用tablename.column名稱。

SELECT IBID,* 
FROM SaleHeader 
WHERE IBID IS NOT NULL 
ORDER BY SaleHeader.IBID

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM