为什么在SQL子查询中受限制

Pan*_*kaj 4 sql-server subquery sql-order-by

在子查询中使用order by时会抛出错误:例如:

set rowcount 10 
select * from XXX where Col1 in(
select Col2 from YYY 
order by Col3 desc
)
Run Code Online (Sandbox Code Playgroud)

想了解为什么在SQL-Server中限制这种类型的查询?抛出的错误是:

除非还指定了TOP,OFFSET或FOR XML,否则ORDER BY子句在视图,内联函数,派生表,子查询和公用表表达式中无效.

RBa*_*ung 6

为什么?

简答:

因为集合没有订单.

更长的答案:

SQL是Relational Calculus的一个实现,它基于元组集(表,行等).集合没有任何顺序(与相关概念不同,列表是带有排序的集合).

此外,(通常)在最终输出之前对一组进行排序没有任何好处,并且造成相当大的伤害,因为:

  • 优化器可以在查询执行的阶段添加或删除排序,以便提高查询的性能,
  • 所以,它只是(相当多)额外的工作,
  • 优化器可能只是在下一步撤消它
  • 并且查询和阶段可以并行完成,因为优化器看起来很合适,这通常与保留排序相冲突.
  • 因此,较早应用它并不意味着该命令将在稍后阶段仍然存在

通常有意义的唯一地方是最终输出,因为无论如何数据必须在那里连续传输.

在最终输出之前唯一有意义的地方是TOP (N)需要排序以确定哪些行是"顶部"行的事情.

它对某些Aggregate函数也有意义,这就是为什么它们中的许多都有自己 ORDER BY子句.还用于在中间阶段构造XML结果.