0

, Original_TableUPDATEUPDATE는

WITH temp AS (
    SELECT 
     ROW_NUMBER() over (partition by x order by y) row_num, x, z 
    FROM Original_Table) 

UPDATE temp set z = a + (select ISNULL(SUM(a),0) from temp A where A.x= temp.xand A.row_num < temp.row_num) 

업데이트하지만 도착 전 단지 다음

CREATE TABLE 
    #temp 
(
    row_num INT NOT NULL , 
    x INT NOT NULL, 
    a DECIMAL NOT NULL , 
    z DECIMAL NULL 
); 

insert into #temp 
    SELECT 
     ROW_NUMBER() over (partition by x order by y) row_num, x, z 
    FROM Original_Table 

UPDATE temp set z = a + (select ISNULL(SUM(a),0) from temp A where A.x= temp.xand A.row_num < temp.row_num) 

UPDATE 업데이트와 함께 교체 할 때 #temp 테이블 아니지만 Original_Table

왜 그렇습니까? 맨 마지막 문장

UPDATE temp 
set z = a + (select ISNULL(SUM(a),0) 
       from temp A where A.x= temp.x 
       and A.row_num < temp.row_num) 

는 일부 테이블 이름 "온도"를 업데이트

+0

공통 테이블 식이라고합니다. MS SQL의 경우 https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx – Serg

+2

을 참조하십시오. 'original_table'을 (를) 업데이트하려고 시도하지 않았습니다. –

+0

'UPDATE'는 동일합니다. 'WITH'만 변경됩니다. –

답변

2

첫 번째 예는 CTE를 통해 Original_Table의 쿼리를 기반으로 temp을 업데이트합니다. 기본 테이블은 CTE가 갱신 될 때 갱신됩니다. here에서 설명한대로 CTE는 범위 내에서 UPDATE의 범위입니다.

두 번째 예는 Original_Table을 쿼리하고 새 테이블 : #temp에 결과를 저장합니다. 그러면 임시 테이블이 갱신됩니다. #temp의 행과 Original_Table의 행을 다시 연결하는 마법 메모리은없고 이 없으므로 원하지 않을 것입니다.

1

. 명령문에 참조가 없음 Original_Table

+0

첫 번째 경우'Original_Table'을 업데이트합니다 –

+0

Original_Table이 명령문 내에서 참조되기 때문에 그렇습니다. 첫 번째 스크립트는 업데이트를 수행하는 길고 합리적으로 복잡한 공통 테이블 식인 단일 명령문입니다. 두 번째 스크립트는 CREATE (임시) TABLE, INSERT, UPDATE 순이다. –