当前位置:  开发笔记 > 编程语言 > 正文

SQL Server UNION - 默认的ORDER BY行为是什么

如何解决《SQLServerUNION-默认的ORDERBY行为是什么》经验,为你挑选了4个好方法。

如果我有一些UNION声明作为一个人为的例子:

SELECT * FROM xxx WHERE z = 1
UNION 
SELECT * FROM xxx WHERE z = 2
UNION
SELECT * FROM xxx WHERE z = 3

什么是默认order by行为?

我看到的测试数据基本上不会按照上面指定的顺序返回数据.即数据是有序的,但我想知道这有什么优先规则.

另一件事是,在这种情况下,xxx是一个视图.视图将3个不同的表连接在一起以返回我想要的结果.



1> DJ...:

没有默认订单.

如果没有Order By子句,则返回的顺序是未定义的.这意味着SQL Server可以按照自己喜欢的顺序将它们带回来.

编辑:根据我所看到的,没有Order By,结果返回的顺序取决于查询计划.因此,如果有一个正在使用的索引,结果可能会按此顺序返回,但再次无法保证.


对于许多顺序选择可以返回的顺序可以是一致的.但你不应该依赖与任何事物有任何巧合关系的命令.添加表,索引或更多数据可能会影响订单.不要成为一个懒惰的程序员.

2> Will Rickard..:

关于添加ORDER BY子句:

这对大多数人来说可能是基本的,但我想我加上这个.有时您不希望结果混合,因此您需要第一个查询的结果,然后是第二个,依此类推.要做到这一点,我只需添加一个虚拟的第一列并按顺序排序.由于忘记在联合中对列进行别名可能存在问题,我通常在order by子句中使用序数,而不是列名.

例如:

SELECT 1, * FROM xxx WHERE z = 'abc'
UNION ALL
SELECT 2, * FROM xxx WHERE z = 'def'
UNION ALL
SELECT 3, * FROM xxx WHERE z = 'ghi'
ORDER BY 1

当我要运行两个查询并且我知道只有一个将返回任何结果时,虚拟序列列也很有用.然后我可以检查返回结果的序数.这使我不必进行多个数据库调用和大多数空结果集检查.



3> Ray Booysen..:

刚刚找到了实际答案.

因为UNION删除了重复项,所以它会执行DISTINCT SORT.这是在连接所有UNION语句之前完成的(检查执行计划).

要停止排序,请执行UNION ALL,这也不会删除重复项.


这并没有真正回答这个问题:如果你做一个`union all`,订单仍然是未定义的吗?(请参考)

4> BradC..:

如果您关心返回记录的顺序,您必须使用订单.

如果将其遗漏,它可能看起来有条理(基于查询计划选择的索引),但您今天看到的结果可能不是您期望的结果,甚至可能在明天运行相同查询时更改.

编辑:一些好的,具体的例子:(所有的例子都是MS SQL服务器)

Dave Pinal的博客描述了两个非常相似的查询如何显示不同的明显顺序,因为使用了不同的索引:

SELECT ContactID FROM Person.Contact
SELECT *         FROM Person.Contact

Conor Cunningham展示了当表变大时,表观顺序如何变化(如果查询优化器决定使用并行执行计划).

Hugo Kornelis证明了明显的顺序并不总是基于主键.这是他的后续帖子和解释.

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有