Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 联合排序_Sql_Oracle_Union - Fatal编程技术网

Sql 联合排序

Sql 联合排序,sql,oracle,union,Sql,Oracle,Union,在oracle中,使用UNION连接两个表是否会隐式排序数据?看起来是这样,因为如“解释计划”窗口所示,它显示“排序唯一” 我的问题是:默认情况下,它按什么列排序 是,为了删除重复项,排序是隐式的,因为UNION不包括重复项,如UNION ALL,但是,如果您想要有保证的排序,请在所有联合之后使用ORDER BY,以确保获得所需的排序它确实需要强制唯一性,因此通常至少需要进行部分排序。 理论上,如果它可以通过另一种机制保证唯一性(例如从指定的分区中选择,其中分区键保证没有重叠),那么它可能不会,

在oracle中,使用UNION连接两个表是否会隐式排序数据?看起来是这样,因为如“解释计划”窗口所示,它显示“排序唯一”


我的问题是:默认情况下,它按什么列排序

是,为了删除重复项,排序是隐式的,因为
UNION
不包括重复项,如
UNION ALL
,但是,如果您想要有保证的排序,请在所有联合之后使用ORDER BY,以确保获得所需的排序

它确实需要强制唯一性,因此通常至少需要进行部分排序。 理论上,如果它可以通过另一种机制保证唯一性(例如从指定的分区中选择,其中分区键保证没有重叠),那么它可能不会,但我还没有看到这样的例子

但是,它不需要生成排序输出,因为它可以使用哈希排序。也就是说,它把所有的“A”字粘在一个桶里,把所有的“B”字粘在下一个桶里,依此类推。各个bucket的内容将被排序,但查询可能会返回“A”bucket之前的“B”bucket的结果


在9i和10g之间,Oracle通过修改组来进行哈希排序。因此,许多认为分组方式意味着排序输出是理所当然的人被抓住了。

优化器在执行诸如
联合
分组方式
不同
等操作时,有多种方法确保唯一性。随着时间的推移,随着Oracle对优化器的改进,新的方法可能也有望被引入。有时这是一种。但不能保证它将始终是排序,即使它今天使用排序,明天也可能不会


如果需要对输出进行排序,唯一的保证方法是使用
orderby
子句。如果没有order byOracle(以及任何SQL数据库)可以自由地以任何顺序返回行。

这意味着如果不使用order by,就没有默认的列或过程来对结果进行排序了?因为我认为它是使用select语句的排列进行排序的,就像它是先使用您检索到的第一列进行排序,然后再使用其他列进行排序一样。我是不是想错了?-1“是的,为了删除重复项,排序是隐式的”优化器可能会决定使用哈希表删除重复项。@Jenny:是的,你错了。如果没有按排序,数据库可以以任何顺序返回行,并且不能保证每次都以相同的顺序返回行。您可以自己验证前一个声明:尝试从字典中选择表名(或任何其他较大的系统表)。@cyberkiwi:很抱歉太迂腐了,Oracle为分组添加了另一种方式。如果优化器相信计划将以更少的资源执行,Oracle仍然可以使用普通排序而不是哈希表。我把switch改为删除排序,改为哈希表。因此,查询可以今天排序为group/union/etc,明天再更改为哈希表,并且在2013年升级到12gR2时还没有生成任何内容。+1,但您可能指的是“hash group BY”,而不是“hash sort”