2012-05-01 4 views
0

Мой вопрос связан с порядком обновлений в одном заявлении об обновлении. Я заметил, что когда я устанавливаю переменные с помощью оператора SELECT, переменные устанавливаются в порядке. Например:Обновление столбца на другом обновленном столбце

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

На данный момент @Test1 будет 2 и @Test2 будет 3, потому что набор операций выполняются в порядке. Но что происходит с UPDATE?

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

Будет Test2 использовать начальное значение Test1 в его расчете или будет использовать значение мы просто установить? Не имеет значения, если это UPDATE заявление внутри MERGE?

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-of-output-columns-in-a-query-is-this-valid-ansi –

ответ

2

Название на правой стороне заданий относятся к старым значениям столбцов, независимо от того, что они находятся.

Это (например) позволяет поменять местами два значения без используя временную переменную.

UPDATE foo 
SET a = b, 
    b = a 

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


The SQL-92 спецификации (раздел 13.10, Общие правила, пункт 6 на странице 395) говорится:

  • The <value expression> с эффективно оценивали каждая строка 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

Смежные вопросы