是否保证联合所有查询的两个部分的顺序将按特定顺序给出?即这个查询的结果:
select 'foo' from dual
union all
select 'bar' from dual
将一直是
foo
bar
而不是这个
bar
foo
?
我使用了 Oracle 语法,但我想知道 ISO 标准对此有何规定。
是否保证联合所有查询的两个部分的顺序将按特定顺序给出?即这个查询的结果:
select 'foo' from dual
union all
select 'bar' from dual
将一直是
foo
bar
而不是这个
bar
foo
?
我使用了 Oracle 语法,但我想知道 ISO 标准对此有何规定。
在您的特定示例中,顺序不应更改,因为您正在查询DUAL
表,并且您不必担心该特定查询的潜在索引更改。所以你总是会分别得到 Foo 然后 Bar 。
然而,在现实世界中,是的,顺序肯定会改变——取决于几个因素,例如表索引、返回的列、引入的新数据等。所以如果你希望你的结果以特定的方式排序,你需要指定ORDER BY
子句。
希望这可以帮助。
建议重写您的查询:
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
ISO 标准说表格本质上是无序的。它还说,当您从查询返回行时,不能保证顺序,除非您使用order by
子句。
实际上,在这种情况下,大多数数据库将在 bar 之前返回 foo。但是,如果您更改union all
为union
,某些数据库可能会首先返回该条。
更糟糕的是,您甚至不能说第一个查询中的所有行都将在第二个查询之前返回。例如,在并行环境中,来自所有两个表的联合的结果集可以混合行。
如果您首先想要 foo,然后添加order by txt desc
或其他内容。