1
SELECT TOP 1 Col1,col2
FROM table ... JOIN table2
...Some stuff...
 ORDER BY DESC

は異なる結果をもたらします。に比べ

SELECT Col1,col2
FROM table ... JOIN table2
...Some stuff...
 ORDER BY DESC

2番目のクエリは私にいくつかの行を与えます.この結果の上位1つが必要な場合は、TOP 1句を使用して最初のクエリを記述します. これらは両方とも異なる結果をもたらします。

なぜこの動作は異なるのですか

4

3 に答える 3

4

これはあまり明確ではありませんが、最初のクエリで返された行が 2 番目のクエリで返された最初の行と同じではないことを意味していると思います。これは、 order by に重複する値が含まれていることが原因である可能性があります。

たとえば、Test というテーブルがあるとします。

+-----+------+
| Seq | Name |
+-----+------+
| 1   | A    |
| 1   | B    |
| 2   | C    |
+-----+------+

した場合Select * From Test Order By Seq、これらのいずれかが有効です

+-----+------+
| Seq | Name |
+-----+------+
| 1   | A    |
| 1   | B    |
| 2   | C    |
+-----+------+

+-----+------+
| Seq | Name |
+-----+------+
| 1   | B    |
| 1   | A    |
| 2   | C    |
+-----+------+

一番上の場合、どちらの行も取得できます。

上位 1 節があるということは、クエリ オプティマイザーがまったく異なるアプローチを使用して結果を生成することを意味する可能性があります。

于 2012-12-04T14:37:32.183 に答える
1

あなたが SQL Server で作業していると仮定するので、Laurence の答えはおそらく正確です。ただし、完全を期すために、これは使用しているデータベース テクノロジにも依存します。

通常、SQL Server などのインデックス ベースのデータベースは、実行プランの作成方法に応じて、インデックスで並べ替えられた結果を返します。しかし、すべてのデータベースがインデックスを利用しているわけではありません。

たとえば、Netezza は、インデックスの概念なしでシステム内のデータの場所を追跡します (Netezza のシステム アーキテクチャはかなり異なります)。その結果、クエリの 1 番目のレコードを選択すると、結果セットのランダム レコードが一番上に表示されます。同じクエリを複数回実行すると、毎回異なる順序になる可能性があります。

データを順序付けする必要がある場合は、データベースが実行計画を作成するときに使用する任意の順序付けに依存するのではなく、自分で順序付けを強制することが最善の方法です。これにより、結果がより予測しやすくなります。

于 2012-12-04T15:58:11.817 に答える
-3

最初のクエリは、1 つのテーブルの一番上の行を取得し、条件付きの別のテーブルと比較します。したがって、通常の結合とは異なる値が返されます。

于 2012-12-04T14:40:16.583 に答える