2012-05-01 22 views
0

私の質問は、1つの更新ステートメントでの更新の順序と関係がある。私は、SELECTステートメントを使用して変数を設定すると、変数が順番に設定されることを確認しました。例えば:この時点@Test1別の更新された列に基づく列の更新

SELECT 
    @Test1 = 2, 
    @Test2 = @Test1 + 1 

2@Test2になり、設定された操作が順に行われているため3になります。しかし、UPDATEはどうなりますか?

UPDATE TestTable SET 
    Test1 = 2, 
    Test2 = Test1 + 1 

Test2その計算にTest1の初期値を使用しますか、それは我々だけで設定された値を使用しますか? MERGEの内部にUPDATEのステートメントがあれば、それは何か違いはありますか?割り当ての右側の

MERGE INTO TestTable AS T 
    USING (
     SELECT 
       Test1, 
       Test2 
      FROM SomeOtherTable 
     ) AS S 
     ON S.Test1 = T.Test1 
    WHEN MATCHED THEN 
     UPDATE SET 
      T.Test1 = 2, 
      T.Test2 = T.Test1 + 1 
    ; 
+1

これは、すべてのSQL実装で同じように指定されているかどうかはわかりません。派生列の早期再利用を可能にするTeradataの関連する問題を参照してください。 http://stackoverflow.com/questions/2458700/early - または - re-ordered-re-use-derived-of-a-query-is-this-valid-ansi –

答えて

2

名前は、彼らがしているために関係なく、列の古い値を参照してください。

これ(例えば)せずに2つの値を交換することができます一時変数を使用します。

UPDATE foo 
SET a = b, 
    b = a 

http://sqlfiddle.com/#!3/f6984/1


SQL-92仕様(項13.10、総則、ページ395の項目6)は述べている:

  • <value expression> sは効果が評価されますTの各行を更新する前にTの各行を更新する。
+0

これはどこかに記載されているのか、それとも既知のものですか? – Schmalls

+0

@Schmalls: "これはどこかに書かれていますか?"まあ、前に文書化されていなければ、それは今です。 :)私は*それはSQL標準で要求される動作だと思っていますが、私はそれを手元に持っていません。 –

+2

[SQL-92仕様](http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt)にありました。セクション13.10、一般ルール、アイテム6、ページ395。 – Schmalls

関連する問題