工会的秩序是不是都得到保证

Posted

技术标签:

【中文标题】工会的秩序是不是都得到保证【英文标题】:Is the order of union all guaranteed工会的秩序是否都得到保证 【发布时间】:2013-01-17 21:16:14 【问题描述】:

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

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

永远都是

foo
bar

不是这个

bar
foo

?

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

【问题讨论】:

"在 SQL 世界中,顺序不是一组数据的固有属性。因此,您无法保证……您的数据将按特定顺序返回 - 甚至在一致的顺序 -- 除非您使用 ORDER BY 子句查询数据。" 我不知道订单是否有保证(不应该),但您可以将这些查询包含在另一个查询中,然后手动对结果进行排序SELECT * FROM (SELECT 'foo' AS col_1 ... UNION ...) ORDER BY col_1。至少这样的查询是冗长而明确的。 【参考方案1】:

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

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

希望这会有所帮助。

【讨论】:

【参考方案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

【讨论】:

谢谢,这很简单。我想知道是否需要这样的重写。 正如其他人所说,您可能会没事,但不指定就不能保证。【参考方案3】:

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

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

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

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

【讨论】:

以上是关于工会的秩序是不是都得到保证的主要内容,如果未能解决你的问题,请参考以下文章

工会中的char字节是否被反转?

中国工运史(11) 工会服务治理整顿

ConcurrentDictionary 的列表顺序是不是得到保证?

jQuery 的 $().each() 的排序顺序是不是得到保证?

从 LinkedHashMap 对象返回键和值的顺序是不是得到保证?

在这种方法调用和传入参数的情况下,Java 评估顺序是不是得到保证