3

ユニオンの2つの部分の順序は、すべてのクエリが特定の順序で指定されることが保証されていますか?つまり、このクエリの結果は次のとおりです。

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

実際には、この場合、ほとんどのデータベースはバーの前にfooを返します。ただし、に変更union allするとunion、一部のデータベースはおそらく最初にバーを返します。

さらに悪いことに、最初のクエリのすべての行が2番目のクエリの前に返されるとは言えません。たとえば、並列環境では、2つのテーブルすべての和集合からの結果セットが行を混在させる可能性があります。

最初にfooが必要な場合は、order by txt descその効果に何かを追加します。

于 2013-01-17T22:14:31.383 に答える