クエリ1 = ISQL Server:なぜこれらのクエリは異なる結果セットを返しますか?
クエリ2 = Iがトップ5句を削除しても、彼らはまだ別の返却商品数I
からトップ5 i.item_id、i.category_idを選択項目からトップ5 i.item_idを選択行。
「ITEMS iからトップ5を選択」を実行すると、これは全く異なる結果セットを返します!
クエリ1 = ISQL Server:なぜこれらのクエリは異なる結果セットを返しますか?
クエリ2 = Iがトップ5句を削除しても、彼らはまだ別の返却商品数I
からトップ5 i.item_id、i.category_idを選択項目からトップ5 i.item_idを選択行。
「ITEMS iからトップ5を選択」を実行すると、これは全く異なる結果セットを返します!
ORDER BY句がない場合、「TOP N」の修飾されたSELECTの結果は不確定です。
ORDER BY
句がないと、結果を得る順序を予測できません。おそらく、SQL Serverがこれらのクエリを異なる方法で処理する理由についての興味深い根底にある理由がありますが、ユーザーの観点からは、単にクエリに関連するORDER BY
句を課すだけで、5つの項目が最初に来ることを保証します。
理由は簡単です。ORDER BY句を指定しなかったためです。例えば、オプティマイザは、異なるIDを使用して2つの異なるクエリーを満たすことができます。カテゴリIDではなく、最初のクエリーを満たすためには、ItemIDを含むリーンインデックスがあります。
ORDER BY句を指定していないのでは、オプティマイザがあなたの求めているクエリを実行するための最も効率的な方法を決定します。非常に一般的な質問は、缶詰naswerを持っています。つまり、2つのクエリで指定した2つの列に対して異なるインデックス作成が行われる可能性があります。その結果、表示される結果になります。
他は言語自体に基づいて正しいものですが、これはSQL Serverのスポットライトです。見積もり実行計画を調査すると、多くの異なる指標が使用される可能性があります。しかし、私の腸は、問題のテーブルにインデックスがないと私に伝えます。私からの –
+1、ところで。 –
厳密には、ORDER BYのないSELECTの結果は不定です。 TOPはn行を5行に制限するだけなので、どのような順序でもすべての行ではなく、5つの行が得られます。 – gbn
Heh。まあ*厳密には、注文は通常不確定です(SQLの場合、ORDER BYがなければ技術的には存在しません)。しかし、TOPでは、ORDER BYなしでは実際の*内容*は不確定です。 – RBarryYoung
私たちはどちらも正しいですが、TOPは不確定な注文の結果です;-)最初の回答のために+1を依頼しました – gbn