在子查询中使用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。
答案 0 :(得分:6)
<强> 为什么? 强>
简答:
因为套装没有订单。
更长的答案:
SQL是Relational Calculus的一个实现,它基于元组 - 集(表,行集等)。集合没有任何顺序(与相关概念不同,列表是具有排序的集合)。
此外,(通常)在最终输出之前对一组进行排序并没有任何好处,并且造成相当大的伤害,因为:
它通常唯一有意义的地方是最终输出,因为无论如何必须在那里连续传输数据。
在最终输出之前唯一有意义的地方是像TOP (N)
这样的事情需要排序来确定哪些行是“顶部”行。
对于某些聚合函数也是有意义的,这就是为什么它们中的许多都有自己的 ORDER BY
子句。也用于在中间阶段构建XML结果。