SQL Select语句中的歧义列错误

时间:2014-04-23 07:14:31

标签: sql sql-server-2008 sql-server-2012

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中运行正常吗?

6 个答案:

答案 0 :(得分:2)

我的猜测是您的SQL Server 2008数据库处于SQL Server 2000兼容模式,因为normally it should return the same error是您的2012实例。

尝试在查询中完全限定表名并在具有默认兼容级别的数据库上下文中在SQL Server 2008中运行它(例如在tempdb的上下文中),您可能会看到错误

行为的差异是设计的,并在this Technet article中记录如下(强调增加):

  

兼容级别设置为80

     

...

     

将ORDER BY列表中的列引用绑定到SELECT列表中定义的列时, 列歧义将被忽略 ,并且有时会忽略列前缀。这可能导致结果集以意外顺序返回。

答案 1 :(得分:0)

您的表已包含 IBID 列,因此在ORDER BY子句中,sql server无法决定从哪个列访问和排序, IBID 来自获得的表在SELECT列表

开头指定的*或IBIS列中
Select IBID,s.* from SaleHeader s WHERE IBID IS NOT NULL Order BY s.IBID

指定表的别名,如上所示

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这是因为列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

关于'为什么':

查询是否完全相同?也许两个平台上的翻译都不同。您对此查询的使用有何不同? (例如,您是单独运行还是作为视图定义运行。它在分析方式上有很大不同)

答案 4 :(得分:0)

这是因为您选择了IBID列两次。

尝试:

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

答案 5 :(得分:0)

你的桌子已经有了那个专栏。如果在一个查询中使用2次列,则sql server需要指定要访问的表列。按顺序使用 tablename.column 名称。

SELECT IBID,* 
FROM SaleHeader 
WHERE IBID IS NOT NULL 
ORDER BY SaleHeader.IBID
相关问题