3

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

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

将一直是

foo
bar

而不是这个

bar
foo

?

我使用了 Oracle 语法,但我想知道 ISO 标准对此有何规定。

4

3 回答 3

3

在您的特定示例中,顺序不应更改,因为您正在查询DUAL表,并且您不必担心该特定查询的潜在索引更改。所以你总是会分别得到 Foo 然后 Bar 。

然而,在现实世界中,是的,顺序肯定会改变——取决于几个因素,例如表索引、返回的列、引入的新数据等。所以如果你希望你的结果以特定的方式排序,你需要指定ORDER BY子句。

希望这可以帮助。

于 2013-01-17T21:31:44.390 回答
2

建议重写您的查询:

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
于 2013-01-17T21:55:13.523 回答
1

ISO 标准说表格本质上是无序的。它还说,当您从查询返回行时,不能保证顺序,除非您使用order by子句。

实际上,在这种情况下,大多数数据库将在 bar 之前返回 foo。但是,如果您更改union allunion,某些数据库可能会首先返回该条。

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

如果您首先想要 foo,然后添加order by txt desc或其他内容。

于 2013-01-17T22:14:31.383 回答