【问题标题】:Are SQL SELECT statements by definition stable?根据定义,SQL SELECT 语句是否稳定?
【发布时间】:2013-03-06 11:03:36
【问题描述】:

这是我的问题,我被要求确保一个大项目中的语句都被包装成这样:

Select * from (Select ... order by column)

保持他们的顺序。这就引出了一个问题,是否有一些官方来源定义 SQL 选择结果保持其顺序?

将此场景设置为可抓取但最小的上下文:

假设您有一个名为 exampleTBL 的表,其中包含 A 和 B 列。您执行以下语句:

Select * from (Select B from exampleTBL order by A);

独立于使用的DBMS/Driver/Platform/... 的结果是否会由 A 排序?

【问题讨论】:

  • 不,如果您不提供ORDER BY(在最外面的查询上),则无法保证订单。否则,优化器将为您决定顺序。
  • @TimSchmelter 你有官方消息吗?并不是说我不相信你的说法,但我真的很想要一个消息来源。
  • 我现在没时间去搜索,反正还是要看 rdbms(虽然我觉得至少 Oracle 和 MS SQL-Server 一起去)。
  • @TimSchmelter 我知道,至少在 Oracle 上,该声明将保持有序 :) 感谢您抽出宝贵时间,如果有官方消息来源,我会尽力寻找。
  • 我不确定Oracle,但是,如果您不提供订单,我认为无法保证订单。 stackoverflow.com/a/3764548/284240

标签: sql select sql-order-by definition


【解决方案1】:

来自SQL-2003 Standard (71WD2-02-Foundation-2011-12):


4.15.3 派生表

派生表是通过评估一个或多个其他表直接或间接派生的表 表达式,例如 <joined table><data change delta table><query expression><table expression>。一种 <query expression> 可以包含一个可选的 .指定表的行的顺序 由<query expression> 保证仅适用于立即包含<order by clause><query expression>


因此,DBMS 没有义务在子查询中维护 order by。在您的示例中,只需使用:

Select B from (Select B, A from exampleTBL) t order by A;

无论您的 DBMS 是否维护订单,我都会推荐这种方法。

【讨论】:

    【解决方案2】:

    没有。并非每个数据库都支持子查询中的排序,因此您应该在外部查询中定义顺序(或者更好的是摆脱外部查询)。此外,如果您想确保获得相同的结果,您应该按顺序包含您选择的每一列。最后,无论是否使用索引,外部的 order by 都不会改变。

    【讨论】:

    • 我不同意这种说法如果您想确保获得相同的结果,您应该按顺序包含您选择的每一列。如果从单个表中选择并按主键排序,则顺序将始终相同,而不使用所有字段。这并不是说为保持结果一致而按尽可能多的列进行排序是无效的,但没有必要按所有列进行排序。
    • 你是对的。它应该更像 在 ORDER BY 中包含一列或一组列,以保证它们在结果中是唯一的,但我不知道如何编写它以便于理解。
    • @JakubKania 这就是候选键的定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    相关资源
    最近更新 更多