gpt4 book ai didi

sql-server - 为什么 SQL 子查询中的 order by 受到限制?

转载 作者:行者123 更新时间:2023-12-03 02:29:45 28 4
gpt4 key购买 nike

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

set rowcount 10
select * from XXX where Col1 in(
select Col2 from YYY
order by Col3 desc
)

为什么这种类型的查询在 SQL Server 中受到限制?抛出的错误是:

The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.

最佳答案

为什么?

简短回答:

因为集合没有顺序。

更长的答案:

SQL 是 relational calculus 的实现,它基于元组集(表、行集等)。集合没有顺序(与相关概念不同,列表是具有顺序的集合)。

此外,在最终输出之前对集合应用排序(通常)没有任何好处,而且会带来相当大的危害,因为:

  • 优化器可以在查询执行的任何阶段添加或删除排序(只要它认为合适),以提高查询的性能,
  • 所以,这只是(相当多的)额外工作,
  • 优化器可能会在下一步中撤消它
  • 查询和阶段可以并行完成,只要优化器认为合适,但这通常也与保留顺序相冲突。
  • 因此,较早应用它并不意味着该订单在稍后阶段仍然存在

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

在最终输出之前,唯一有意义的地方是诸如 TOP (N) 之类的东西,它需要排序来确定哪些行是“Top”行。

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

关于sql-server - 为什么 SQL 子查询中的 order by 受到限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31474694/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com