繁体   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