ユニオンの2つの部分の順序は、すべてのクエリが特定の順序で指定されることが保証されていますか?つまり、このクエリの結果は次のとおりです。
select 'foo' from dual
union all
select 'bar' from dual
常になります
foo
bar
これではありません
bar
foo
?
私はOracle構文を使用しましたが、知りたいのはISO標準がこれについて何と言っているかです。
ユニオンの2つの部分の順序は、すべてのクエリが特定の順序で指定されることが保証されていますか?つまり、このクエリの結果は次のとおりです。
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
実際には、この場合、ほとんどのデータベースはバーの前にfooを返します。ただし、に変更union all
するとunion
、一部のデータベースはおそらく最初にバーを返します。
さらに悪いことに、最初のクエリのすべての行が2番目のクエリの前に返されるとは言えません。たとえば、並列環境では、2つのテーブルすべての和集合からの結果セットが行を混在させる可能性があります。
最初にfooが必要な場合は、order by txt desc
その効果に何かを追加します。