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

时间:2015-07-17 11:23:00

标签: 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
)

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

  

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

1 个答案:

答案 0 :(得分:6)

<强> 为什么?

简答:

因为套装没有订单。

更长的答案:

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

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

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

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

在最终输出之前唯一有意义的地方是像TOP (N)这样的事情需要排序来确定哪些行是“顶部”行。

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