0

次のように、複数の行を含む可能性のあるビューがあります。

[rate] | [vendorID]
 8374       1234
 6523       4321
 5234       9374

SPROC では、ビューの最初の行の最初の列の値に等しいパラメーターを設定する必要があります。このようなもの:

DECLARE @rate int;
SET @rate = (select top 1 rate from vendor_view where vendorID = 123)
SELECT @rate

しかし、これは常にビューの最後の行を返します。

実際、単に副選択を単独で実行すると、最後の行しか取得できません。
ビューに 3 行ある場合、TOP 2 は FIRST 行と THIRD 行を順番に返します。4行で、上位3つを順番に返しています。それでもトップ1は最後を返しています。DERP?!?

これは動作します..

DECLARE @rate int;

CREATE TABLE #temp (vRate int)
INSERT INTO  #temp (vRate) (select rate from vendor_view where vendorID = 123)

SET @rate = (select top 1 vRate from #temp)
SELECT @rate

DROP TABLE #temp

..しかし、誰かが最初の動作が非常に曖昧である理由と、私が望むことを行う方法を教えてもらえますか? コメントで説明されているように、注文を行うための意味のある列はありません。行が挿入される順序を、返される順序にすることはできますか?

[編集] また、次のことにも気付きました:select top 1 rate from ([view definition select])また、正しい値を何度も返します。[/編集]

4

3 に答える 3

1

それは設計によるものです。

クエリの並べ替え方法を指定しない場合、データベースは都合のよい順序で自由にレコードを返すことができます。デフォルトのソート順として使用されるテーブルには、自然な順序はありません。

実際の順序はクエリがどのように計画されているかによって異なります。そのため、データベースがデータに関する統計を収集し、クエリの計画方法が変更される可能性があるため、時間の経過とともに一貫した結果が得られる同じクエリに依存することさえできません。その上で。

期待どおりのレコードを取得するには、並べ替え方法を指定するだけです。次に例を示します。

select top 1 rate
from vendor_view
where vendorID = 123
order by rate
于 2013-03-20T23:46:16.777 に答える
1

何年も機能していたクエリでこの問題に遭遇しました。SQL Server をアップグレードしたところ、突然、順不同select top 1がテーブルの最終レコードを返さなくなりました。に を追加しただけorder byですselect

私の理解では、SQL Serverは通常、クラスター化されたインデックスorder byが提供されていない場合、またはエンジンによって選択されたインデックスから外れている場合、クラスター化されたインデックスに基づいて結果を提供します。ただし、これは特定の順序を保証するものではありません。

注文するものがない場合は、追加する必要があります。日付が挿入された列を追加してデフォルトにするGETDATE()か、identity列を追加します。歴史的には役に立ちませんが、今後の問題に対処します。

于 2013-12-27T17:02:00.783 に答える