39

不自然な例としていくつかの UNION ステートメントがあるとします。

SELECT * FROM xxx WHERE z = 1
UNION 
SELECT * FROM xxx WHERE z = 2
UNION
SELECT * FROM xxx WHERE z = 3

デフォルトのorder by動作は何ですか?

私が見ているテスト データは、基本的に、上記で指定された順序でデータを返しません。つまり、データは順序付けされていますが、これに関する優先順位のルールを知りたいと思っていました。

もう 1 つのことは、この場合、xxx がビューであることです。ビューは 3 つの異なるテーブルを結合して、必要な結果を返します。

4

6 に答える 6

46

デフォルトの順序はありません。

Order By句がない場合、返される順序は未定義です。つまり、SQL Server は好きな順序でそれらを戻すことができます。

編集:私が見たものに基づいて、Order Byなしで、結果が返される順序はクエリプランによって異なります。したがって、使用しているインデックスがある場合、結果はその順序で返される可能性がありますが、保証はありません。

于 2009-01-07T16:48:34.647 に答える
17

ORDER BY 句の追加に関して:

これはおそらくここにあるほとんどの人にとって初歩的なことですが、これを追加すると思いました。場合によっては、結果を混在させたくない場合があるため、最初のクエリの結果、次に 2 番目の結果が必要になることがあります。そのためには、ダミーの最初の列を追加して、それで並べ替えます。ユニオンで列のエイリアスを忘れると問題が発生する可能性があるため、通常、order by 句では列名ではなく序数を使用します。

例えば:

SELECT 1, * FROM xxx WHERE z = 'abc'
UNION ALL
SELECT 2, * FROM xxx WHERE z = 'def'
UNION ALL
SELECT 3, * FROM xxx WHERE z = 'ghi'
ORDER BY 1

ダミーの序数列は、2 つのクエリを実行するときに、結果が返されるのは 1 つだけであることがわかっている場合にも役立ちます。次に、返された結果の序数を確認できます。これにより、複数のデータベース呼び出しと最も空の結果セットのチェックを行う必要がなくなりました。

于 2009-01-08T17:08:40.830 に答える
12

実際の答えを見つけました。

UNION は重複を削除するため、DISTINCT SORT を実行します。これは、すべての UNION ステートメントが連結される前に行われます (実行計画を確認してください)。

並べ替えを停止するには、UNION ALL を実行します。これでも重複は削除されません。

于 2009-03-11T11:48:59.583 に答える
8

レコードが返される順序が気になる場合は、order by を使用する必要があります。

これを省略した場合、(クエリ プランによって選択されたインデックスに基づいて) 整理されたように見えるかもしれませんが、今日表示される結果は期待した結果ではない可能性があり、同じクエリが明日実行されると変わる可能性さえあります

編集:いくつかの良い具体的な例:(すべての例はMS SQLサーバーです)

  • Dave Pinal のブログでは、異なるインデックスが使用されているため、2 つの非常によく似たクエリが異なる見かけの順序を示す方法について説明しています。

    SELECT ContactID FROM Person.Contact
    SELECT *         FROM Person.Contact
    
  • Conor Cunninghamは、テーブルが大きくなると (クエリ オプティマイザーが並列実行プランの使用を決定した場合)、見かけの順序がどのように変化するかを示しています。

  • Hugo Kornelisは、見た目の順序が常に主キーに基づいているとは限らないことを証明しています。説明付きの彼のフォローアップ投稿は次のとおりです。

于 2009-01-07T18:27:22.513 に答える
2

UNION は、結果セットの順序付けに関して欺瞞的である可能性があります。これは、データベースがソート メソッドを使用して UNION で暗黙的な DISTINCT を提供することがあるためです。これにより、行が意図的に順序付けられているように見えます。これは UNION ALL には当てはまりません。もちろん、暗黙のdistinctはありません。

ただし、Oracle の 10g+ のハッシュ メソッドなど、順序付けが適用されない暗黙的な個別のアルゴリズムがあります。

DJが言うように、常にORDER BYを使用してください

于 2009-01-07T18:15:49.480 に答える
1

テーブル データが挿入順に返されることを想定している不適切に記述されたコードに出くわすことは非常によくあることですが、コーダーは 95% の確率でそれを回避し、多くの一般的なデータベース (MSSQL、Oracle、 MySQL)。もちろん、これは完全な誤りであり、発見した場合は常に修正する必要があります。また、常に例外なく、自分で Order By 句を使用してください。

于 2009-01-07T18:31:55.547 に答える