2012-05-01 114 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