2016-05-12 10 views
0

はい、私は私が注文することができます知っている最終結果(マージ後)に、StudentID 4はStudentID 3、BEFORE結果に表示理由を理解しようとしているMERGE文 http://blog.sqlauthority.com/2008/08/28/sql-server-2008-introduction-to-merge-statement-one-statement-for-insert-update-delete/Mergeステートメントを使用すると、挿入後のデフォルトのターゲットテーブルのソート?

イムを使用して、この例と一緒に続き結果は、しかし、私はここで働いているデフォルトが何か不思議です。前後の結果と共に、以下のコードを参照してください。誰かがこれを説明できますか?

USE AdventureWorks2012 
GO 
CREATE TABLE StudentDetails 
(
StudentID INTEGER PRIMARY KEY, 
StudentName VARCHAR(15) 
) 
GO 
INSERT INTO StudentDetails 
VALUES(1,'SMITH') 
INSERT INTO StudentDetails 
VALUES(2,'ALLEN') 
INSERT INTO StudentDetails 
VALUES(3,'JONES') 
INSERT INTO StudentDetails 
VALUES(4,'MARTIN') 
INSERT INTO StudentDetails 
VALUES(5,'JAMES') 
GO 

--SELECT * FROM dbo.StudentDetails 

CREATE TABLE StudentTotalMarks 
(
StudentID INTEGER REFERENCES StudentDetails, 
StudentMarks INTEGER 
) 
GO 
INSERT INTO StudentTotalMarks 
VALUES(1,230) 
INSERT INTO StudentTotalMarks 
VALUES(2,255) 
INSERT INTO StudentTotalMarks 
VALUES(3,200) 
GO 


-- see results before Merge 
SELECT * FROM dbo.StudentTotalMarks 
    StudentID StudentMarks 
    1   230 
    2   255 
    3   200 

だから今、私たちは、マージ

MERGE StudentTotalMarks AS stm 
USING (SELECT StudentID,StudentName FROM StudentDetails) AS sd 
ON stm.StudentID = sd.StudentID 
WHEN MATCHED AND stm.StudentMarks > 250 THEN DELETE 
WHEN MATCHED THEN UPDATE SET stm.StudentMarks = stm.StudentMarks + 25 
WHEN NOT MATCHED THEN 
INSERT(StudentID,StudentMarks) 
VALUES(sd.StudentID,25); 
GO 



-- see results after MERGE 
SELECT * FROM dbo.StudentTotalMarks 
StudentID StudentMarks 
1    255 
4    25 
3    225 
5    25 

答えて

0

全く暗黙のソート順がありませんを行います!

データを挿入する順序は関係ありません。このように戻ってくるかもしれない。したがって、ポイントソートはランダムです。

代わりにROW_NUMBER() OVER(ORDER BY col)(または... OVER(ORDER BY...)の他の関数)が使用されました。ソートされた結果セットが返されます(ソート効果を持つ複数の関数を使用しない場合)。

詳細here: General Remarks

しかし検索:いくつかのソート順が最も外側のSELECTORDER BYあるを確保への唯一の方法。

+0

返された結果には 'ORDER BY'がなければ_stability_は存在しません。つまり、SQL Serverの次回の更新で結果の順序が変更されるようにクエリオプティマイザが変更される可能性があります。 – HABO

+0

@HABO、そうですね、 'OVER(ORDER BY ...) 'には依存しません。しかし、これを読んではいけません。* ROW_NUMBER()を使ってクエリによって返された行は、以下の条件が満たされていない限り(番号付きリスト)*条件が満たされている限り、各実行*で正確にソートされた戻り値を保証する* – Shnugo

+0

あなたの答えとコメントの両方に同意します。私が作ろうとしてきたことは、幸せな事故のために「ORDER BY」なしで「働く」コードを持っているユーザーがいるかもしれないということです。結果はいつも同じ順序で戻ってきます。 SQL Serverを更新したり、インデックスを追加したり、新しい実行計画や基本的な最適化の生成を引き起こす何かをくすぐるまで、少なくとも。我々は、注文がアプリケーションにとって重要である場合、明示的に述べなければならないことに同意します。 – HABO

関連する問題