ORDER BYなしでUNIONのエントリを注文するにはどうすればよいですか?
-
03-07-2019 - |
質問
結果セットに最初に a
と b
が続くことを確認するにはどうすればよいですか?順序の難しい問題を解決するのに役立ちます。
これは私がやっていることの簡単な例です:
SELECT a FROM A LIMIT 1
UNION
SELECT b FROM B LIMIT 1;
解決
SELECT col
FROM
(
SELECT a col, 0 ordinal FROM A LIMIT 1
UNION ALL
SELECT b, 1 FROM B LIMIT 1
) t
ORDER BY ordinal
他のヒント
少なくともすべてのDBMSで順序が保証されるとは思わない。
UNIONの順序を制御するために過去に行ったことは次のとおりです。
(SELECT a, 0 AS Foo FROM A LIMIT 1)
UNION
(SELECT b, 1 AS Foo FROM B LIMIT 1)
ORDER BY Foo
UNION
を使用した結果セットは、異なる値を排除します。
ドキュメントには証拠が見つかりませんが、 10
年の経験から、 UNION ALL
は少なくとも Oracle
。
ただし、原子力発電所などを建設している場合は、これに依存しないでください。
いいえ、SQLクエリの結果の順序は、ORDER BY句によってのみ制御されます。場合によっては、ORDER BY句なしで順序付けられた結果が表示されることがありますが、それは偶然(たとえば、オプティマイザーの現在のクエリプランの副作用)であり、保証されていません。
トリッキーな順序付けの問題とは
Oracleの場合、注文なしで最初にリリースされることを保証する方法はありません。問題は、試してみると、ほとんどの場合でも正しい順序で出力される可能性があることです。しかし、本番環境でこれに依存すると、すぐに間違ってしまいます。
データベースは、UNIONのためにORDER BYを実行する必要がある可能性が高いため、そうは思わなかったでしょう。
UNION ALLの動作は異なる場合がありますが、YMMVです。
簡単な答えはイエスです。A、Bの順になります。
所属していません StackOverflow