是否可以保证联合所有查询的两个部分的顺序将按特定顺序给出?即这个查询的结果是:
select 'foo' from dual
union all
select 'bar' from dual
永远是
foo
bar
而不是这个
bar
foo
我使用的是Oracle语法,但我想知道的是ISO标准对此有何看法。
答案 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
或类似的东西。