ORDER BYなしでUNIONのエントリを注文するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/610945

  •  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の順になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top