ORDER BY 子句是否允许用于不在 SELECT 列表中的列?

vel*_*ije 8 sql-server

理论上,SQL Server 中的每条语句都会创建传递给下一条语句的虚拟表。换句话说,当完成 FROM 和 Where 子句后,下一步是从之前创建的虚拟组中选择列。

但是,可以按选择列表中未列出的列对结果集进行排序。

当 SELECT 子句在 ORDER BY 之前执行并且哪个主要任务是选择要呈现的列时,这怎么可能?

这有点令人困惑,或者我没有得到一些东西。

a1e*_*x07 8

这并不总是可能的:

如果指定了 DISTINCT,则 ORDER BY 子句中的表达式只能访问上一步返回的虚拟表(VT5)

(VT5 是由 生成的返回的虚拟表SELECT

如果未指定 DISTINCT ,则 ORDER BY 子句中的表达式可以访问 SELECT 阶段的输入和输出虚拟表

解释取自“Inside SQLServer 2008 T-SQL Querying” ——我不确定这一特定章节是否在线可用(第 6 步:演示ORDER BY阶段,第 16 页。)

因此,

SELECT distinct field2 FROM table1 order by field1 
Run Code Online (Sandbox Code Playgroud)

给出一个错误:


如果指定了 SELECT DISTINCT ,消息 145,级别 15,状态 1,第 1 行ORDER BY 项必须出现在选择列表中。

  • @veljasije:我认为解释是“...ORDER BY 可以访问上一步创建的输入和输出虚拟表”。此外,文档说逻辑处理的每一步都会生成虚拟表,用作下一步的输入。但是,它没有明确指定这种虚拟表是唯一可能的输入,并且必须禁止访问前面步骤返回的虚拟表...... (2认同)