2009-07-10 8 views
3

私は答えがでないと考えていますです。 カウンタの例を検索すると、order by句がないと出力の順序が保証されないことが示されます。row_number()を使用して出力の順序に依存することができます

を考える:MS SQL Serverの2005年

create table #order (orderId int primary key clustered 
    , customerId int not null -- references customer(customerId) 
    , orderDateTIme datetime not null) 

insert into #order values (1, 100, '2009-01-01') 
insert into #order values (2, 101, '2009-01-02') 
insert into #order values (3, 102, '2009-01-03') 
insert into #order values (4, 103, '2009-01-04') 
insert into #order values (5, 100, '2009-01-05') 
insert into #order values (6, 101, '2009-01-06') 
insert into #order values (7, 101, '2009-01-07') 
insert into #order values (8, 103, '2009-01-08') 
insert into #order values (9, 105, '2009-01-09') 
insert into #order values (10, 100, '2009-01-10') 
insert into #order values (11, 101, '2009-01-11') 
insert into #order values (12, 102, '2009-01-12') 
insert into #order values (13, 103, '2009-01-13') 
insert into #order values (14, 100, '2009-01-14') 
insert into #order values (15, 100, '2009-01-15') 
insert into #order values (16, 101, '2009-01-16') 
insert into #order values (17, 102, '2009-01-17') 
insert into #order values (18, 101, '2009-01-18') 
insert into #order values (19, 100, '2009-01-19') 
insert into #order values (20, 101, '2009-01-20') 

select * from #order 
-- Results in PK order due to clustered primary key 

select orderId, CustomerId, orderDateTime 
    , row_number() over (partition by customerId order by orderDateTime) RN 
from #order 

を、出力順序は、2つのプロパティがあります

  1. 行ごとcustomerIdについては、出力に 連続しています。

  2. Row_number()は、それぞれ 以内に順次入力されます。

私の理解では、明示的なorder by節がなければ、これら2つのプロパティは保証されません。上記のプロパティが保持されていない例を探していますが、これはorder by節によって強制されませんが、MS SQL Serverの動作の結果にすぎません。必要に応じて、独自のテーブル定義、インデックスなどを自由に作成してください。

私が間違っている場合は、明示的なorder by節がなくても、これらの順序が保証されていることを示す参照へのリンク。

+2

あなたの例を作成するためのスクリプトでは、誰もがそのようにしたいと思います! –

答えて

10

オーダー結果セットを使用する場合は、にORDER BY句をSELECTに追加します。期間。それ以外の状況は状況によって異なります。テストしている現在のSQLビルド、オプティマイザの日の気分、PiscesでのMars通過の段階によっては動作しないかもしれません。

あなたの仮定と矛盾する簡単な例:

select orderId, CustomerId, orderDateTime 
    , row_number() over (partition by customerId order by orderDateTime) RN 
    , row_number() over (partition by orderDateTime order by customerId) AntiRN 
from #order 
+1

私の前提は、「これらの2つのプロパティは、明示的なorder by節がなければ保証されません」ということです。私の前提を矛盾させていませんが、私が探していた例を示しました。 –

+2

+1すばらしい例! –

2

ここでは関連性を見つけるのに苦労しています。明示的に順序付けが必要な場合は、クエリでORDER BY句を使用することをお勧めします。

私はを返すことはありません。は、結果の順序に依存するクエリを作成する際に、テーブルのデフォルトの順序に頼っています。現代のRDBMSは、インデックスなどに基づいて注文を最適化できるようになるため、心配する必要はありません。 ROW_NUMBERに関しては

それはBY句なしORDERが存在しない場合、出力はROW_NUMBER値によって順序付けされていることの副作用である間、それは保証されませんように、あなたは、この動作に依存することはできません。

また、のみ出力の順序を保証する方法は、ORDER BY句を使用します。

+0

orderby節でそれを呼び出すのではなく、order_number()をover(order by)に依存している他のプログラマーと協力して作業する場合、関連性の高い例を用意したいと思います。 –

0

あなたはそれを注文したい場合は、ORDER BYを使用する必要があります。

StmtText列で、あなただけのすべての作業が行われた後、それらが並べ替えられていますが、物事を取得しない「ことで順序が」存在しない場合だけ

SET SHOWPLAN_ALL ON 

と実行計画を見てください。時には、データがどのように格納/ロード/フィルタリング/結合されたかなど、どのように返されるかによって、いつかは幸運になります。

1

前述のとおり、ORDER BYなしで行の順序に依存することはできません。

しかし、あなたはROW_NUMBER()関数に頼ることができます。

SELECT 
    principal_id, name, 
    ROW_NUMBER() OVER (ORDER BY principal_id DESC) AS DemoRank 
FROM 
    msdb.sys.database_principals 
ORDER BY 
    name 

あなたがDemoRankして、クライアントのデータを消費する場合は、レコードの順番(序数インデックス)に依存している場合は、なし、その後、さえ句

BY ORDERせずに、OKでしょう。

上記の例では、 '##MS_PolicyEventProcessingLogin##' として最初の行(インデックス= 0)を与えるが、DemoRank値を使用して "db_denydatawriter" 基本的

、ORDER BYを使用して得られます。

関連する問題