为什么这种语法无效?

Ang*_*ker 3 sql sql-server sql-server-2005

以下代码:

SELECT JaguarStartupTime, CPU, AmountOfRam, UpdatedOn, *
FROM dbo.MachineConfiguration
WHERE ServerName = 'WashingtonDC01'
AND UpdatedOn > '11/21/2012'
ORDER BY JaguarStartupTime DESC
Run Code Online (Sandbox Code Playgroud)

导致错误:Ambiguous column name 'JaguarStartupTime'.

但是,删除ORDER BY它使它工作.另外,在ORDER BY子句前面添加表格,如下所示,也可以使用它:

SELECT JaguarStartupTime, CPU, AmountOfRam, UpdatedOn, *
FROM dbo.MachineConfiguration
WHERE ServerName = 'WashingtonDC01'
AND UpdatedOn > '11/21/2012'
ORDER BY dbo.MachineConfiguration.JaguarStartupTime DESC
Run Code Online (Sandbox Code Playgroud)

这从来没有对我有意义.谁能解释一下?

Dav*_*vid 8

因为查询包含*SELECT子句中的(所有列),其中还包括JaguarStartupTime列.

在Layman的术语中:所以在检索结果时,列显示两次,然后当服务器尝试应用排序顺序时,它不确定您指的是哪一列.

就个人而言,我会更改查询以消除查询中的使用*,即使这意味着列出一长列列名.这是最好的做法,它将避免这个问题.


至于为什么它在前缀时工作,我在MSDN文档中找到了这个:

在SQL Server中,限定的列名和别名将解析为FROM子句中列出的列.如果order_by_expression未限定,则该值必须在SELECT语句中列出的所有列中唯一.

这只是数据库引擎将SQL语句转换为执行计划的基础机制的一部分.