2012-05-01 6 views
0

내 질문은 단일 업데이트 문에서 업데이트 순서와 관련이 있습니다. 나는 SELECT 문을 사용하여 변수를 설정할 때 변수가 순서대로 설정된다는 것을 관찰했습니다. 예를 들어 :이 시점 @Test1에서다른 업데이트 된 열을 기반으로 열 업데이트

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

는 설정 작업이 순서대로 수행되기 때문에 2@Test23 될 것입니다 될 것입니다. 하지만 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-derived-of-a-query-is-valid-ansi –

답변

2

이름은에있는 순서에 관계없이, 컬럼의 이전 값을 참조하십시오.

이 (예를 들어)없이 두 값을 교환 할 수 있습니다 임시 변수를 사용합니다. http://sqlfiddle.com/#!3/f6984/1


는 SQL-92 사양

UPDATE foo 
SET a = b, 
    b = a 

(섹션 13.10, 일반 규칙은 페이지 395의 항목 6) 상태 :

  • <value expression>

    효과적으로 평가된다 T의 각 행은 T의 임의의 행을 갱신한다.
+0

이 문서는 어딘가에 알려져 있습니까? – Schmalls

+0

@Schmalls : "여기에 문서가 있습니까?" 음, 이전에 문서화되지 않았다면 지금입니다. :) * * SQL 표준에서 요구되는 동작이지만 생각할 수있는 복사본이 없습니다. –

+2

[SQL-92 사양] (http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt)에서 찾았습니다. 13.10 절, 395 페이지의 일반 규칙, 항목 6입니다. – Schmalls

관련 문제