8

SELECT クエリに DISTINCT を含めることは、結果セットを並べ替える必要があることを意味しますか?

そうではないと思いますが、信頼できる回答(Webリンク)を探しています。

次のようなクエリがあります。

Select Distinct foo
From Bar

オラクルでは、結果は異なりますが、ソート順ではありません。Jet/MS-Access では、結果が確実にソートされるようにするために、追加の作業が行われているようです。この場合、オラクルは仕様に従っており、MS Accessはそれを超えていると想定しています。

fooまた、 (特に指定がない限り)並べ替える必要があるというヒントをテーブルに与える方法はありますか?

4

10 に答える 10

6

SQL92仕様から:

DISTINCT が指定されている場合、TXA は TX から冗長な重複値を削除した結果となります。そうでなければ、TXA を TX とする。

...

4) an が指定されていない場合、Q の行の順序は実装依存です。

最終的に本当の答えは、DISTINCT と ORDER BY は SQL ステートメントの 2 つの別個の部分であるということです。ORDER BY 句がない場合、定義による結果は明確に順序付けされません。

于 2009-03-27T22:41:20.227 に答える
5

いいえ。OracleのDISTINCTがソートを意味しない状況はいくつかありますが、その中で最も重要なのは、groupby操作と個別操作の両方に10g+で使用されるハッシュアルゴリズムです。

9i以下でも、順序付けされた結果セットが必要な場合は、常にORDERBYを指定してください。

于 2009-03-28T03:10:08.520 に答える
3

これは SQL サーバーが保証するものではないため、「信頼できる」回答リンクはありません。

これらの結果を見つけるための最良の方法の副作用として、distinct を使用すると、多くの場合、結果が順番に表示されます。ただし、他の多くのことが結果を混同する可能性があり、一部のサーバーは、結果を取得するために並べ替える必要がある場合でも、並べ替えを行わないような方法で結果を返す場合があります。

結論: サーバーが何かを保証しない場合、それを当てにするべきではありません。

于 2009-03-27T21:52:28.627 に答える
1

いいえ、並べ替えを意味するものではありません。私の経験では、たまたま foo である可能性がある既知のインデックスで並べ替えます。

なぜ微妙なのですか?特定の Select Distinct foo を Bar Order by foo から選択しないのはなぜですか?

于 2009-03-27T21:44:15.450 に答える
1

私の知る限りではありません。私が考えることができる唯一の理由は、SQL Server が重複を検出して除外するためにデータを内部的に並べ替え、「事前に並べ替えられた」方法でデータを返すことです。しかし、私はその「副作用」に頼りません:-)

于 2009-03-27T21:44:43.233 に答える
0

私の場合 (SQL サーバー)、例として、国ごとに数値 X が割り当てられた国のリストがありました。X でテーブルの順序から異なる * を選択すると、X で並べ替えられましたが、同時に結果セットの国も並べられましたが、これは直接実装されていませんでした。私の経験から言えば、distinct は暗黙の並べ替えを意味します。

于 2016-04-26T19:59:09.023 に答える
0

私が使用した少なくとも 1 つのサーバー (おそらく約 6 年前の Oracle または SQL Server) では、ORDER BY 句がない場合、SELECT DISTINCT は拒否されました。「他の」サーバー (Oracle または SQL Server) で受け入れられました。あなたのマイレージは異なる場合があります。

于 2009-03-27T21:44:51.313 に答える
0

いいえ、結果はソートされません。「ヒント」を与えたい場合は、必ず ORDER BY を指定できます。

bar order by foo から個別の foo を選択する

ただし、アルファベット順以外にも並べ替えたい場合があることに注意してください。代わりに、他のフィールドの条件で並べ替えたい場合があります。見る:

http://weblogs.sqlteam.com/jeffs/archive/2007/12/13/select-distinct-order-by-error.aspx

于 2009-03-27T21:50:17.120 に答える
-1

はい。Oracleはソートを使用し、個別を計算します。これは、Explain Plan を見ればわかります。その計算で並べ替えを行ったという事実は、結果セットが並べ替えられることを意味するものではありません。結果セットを並べ替える場合は、ORDER BY 句を使用する必要があります。

于 2009-03-27T23:55:41.017 に答える