はい、私は私が注文することができます知っている最終結果(マージ後)に、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
返された結果には 'ORDER BY'がなければ_stability_は存在しません。つまり、SQL Serverの次回の更新で結果の順序が変更されるようにクエリオプティマイザが変更される可能性があります。 – HABO
@HABO、そうですね、 'OVER(ORDER BY ...) 'には依存しません。しかし、これを読んではいけません。* ROW_NUMBER()を使ってクエリによって返された行は、以下の条件が満たされていない限り(番号付きリスト)*条件が満たされている限り、各実行*で正確にソートされた戻り値を保証する* – Shnugo
あなたの答えとコメントの両方に同意します。私が作ろうとしてきたことは、幸せな事故のために「ORDER BY」なしで「働く」コードを持っているユーザーがいるかもしれないということです。結果はいつも同じ順序で戻ってきます。 SQL Serverを更新したり、インデックスを追加したり、新しい実行計画や基本的な最適化の生成を引き起こす何かをくすぐるまで、少なくとも。我々は、注文がアプリケーションにとって重要である場合、明示的に述べなければならないことに同意します。 – HABO