2013-03-06 61 views
0

这里是我的问题,有人问我,以确保大项目中报表时都裹得像个:SQL SELECT语句是否稳定?

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

保持自己的排序。这引出了一个问题,是否有一些官方的源代码定义了SQL选择结果保持其排序?

要设置此方案为grabbable但最小的范围内:

想象一下,你有一个表名exampleTBL用A和B列执行SQL语句:

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

会的结果,使用DBMS/Driver/Platform/...的独立订单由A?

+0

不,如果您未提供ORDER BY(在最外面的查询上),则无法保证订单。否则,优化器将决定您的订单。 – 2013-03-06 11:06:32

+0

@TimSchmelter你有这方面的官方消息吗?并不是说我不相信你的陈述,但我真的很喜欢一个消息来源。 – 2013-03-06 11:08:47

+0

我现在没有时间去搜索,它依赖于rdbms无论如何(尽管我认为至少Oracle和MS SQL-Server一起)。 – 2013-03-06 11:12:07

回答

1

SQL-2003 Standard(71WD2-02基金会-2011-12):


4.15.3派生表

派生表是一个表,直接或间接从一种或衍生通过评估 表达式(例如<joined table>,<data change delta table>,<query expression><table expression>)的更多其他表。 A <query expression>可以包含一个可选项。 指定的 表中的行的排序仅保证<query expression>立即包含<order by clause>


因此,DBMS没有义务在子查询中维护订单。在你的例子中使用:

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

无论您的数据库管理系统是否维护订单,我都会推荐这种方法。

1

不。不是每个数据库都支持子查询中的排序,因此您应该在外部查询中定义顺序(或者更好,但只是摆脱外部查询)。同样,如果你想确保你会得到相同的结果,你应该包括你在顺序中选择的每一列。最后,如果指数被使用或不使用,则外部排序不会改变。

+1

我不同意声明*如果你想确保你会得到相同的结果,你应该包括你选择的顺序*中的每一列。如果从单个表中选择并通过主键进行排序,则顺序将始终相同,而不使用所有字段。这并不是说为了保持一致的结果所需的列数尽可能多,而是没有必要按所有列排序。 – GarethD 2013-03-06 11:40:56

+0

你说得对。它应该更像_在ORDER BY中包含一列或一组列以确保它们在result_中是唯一的,但我不确定如何编写它以易于理解。 – 2013-03-06 11:56:13

+0

@JakubKania这是候选键的定义。 – 2013-09-09 18:03:44