2012-05-01 167 views
0

我的問題與單個更新語句中的更新順序有關。我觀察到,當我使用SELECT語句設置變量時,變量按順序設置。例如:基於另一個更新列更新列

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

此時@Test12@Test23因爲集操作才能完成。但是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 - 或 - 重新排序 - 重新使用的派生 - 在查詢中的列是這個有效的ansi –

回答

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)中找到它。請參閱第39頁第13.10節,總則,第6項。 – Schmalls