联盟的顺序是否都得到保证

时间:2013-01-17 21:16:15

标签: sql sql-order-by union-all

是否可以保证联合所有查询的两个部分的顺序将按特定顺序给出?即这个查询的结果是:

select 'foo' from dual
union all
select 'bar' from dual

永远是

foo
bar

而不是这个

bar
foo

我使用的是Oracle语法,但我想知道的是ISO标准对此有何看法。

3 个答案:

答案 0 :(得分:3)

在您的特定示例中,订单不应更改,因为您正在查询DUAL表,并且您不必担心该特定查询的潜在索引更改。因此,你将永远得到Foo然后回到Bar。

但是,在现实世界中,是的,订单肯定会发生变化 - 取决于几个因素,例如表索引,返回的列,引入的新数据等等。因此,如果您希望您的结果按特定顺序排序方式,您需要指定ORDER BY子句。

希望这有帮助。

答案 1 :(得分:1)

建议重写您的查询:

SELECT txt FROM (
select 1 as sort, 'foo' as txt from dual
union all
select 2 as sort, 'bar' as txt from dual
) product
ORDER BY sort

答案 2 :(得分:1)

ISO标准规定表本身是无序的。它还说,当您从查询中返回行时,除了使用order by子句之外,还有 no 保证排序。

practice 中,在这种情况下,大多数数据库都会在条形图之前返回foo。但是,如果您将union all更改为union,则某些数据库可能会首先返回该栏。

更糟糕的是,你甚至不能说第一个查询中的所有行都会在第二个查询之前返回。例如,在并行环境中,联合中的所有两个表的结果集可以混合行。

如果您首先想要foo,请添加order by txt desc或类似的东西。