0

Когда я запускаю следующий сценарий, Original_Table обновляется по UPDATE заявленияUPDATE с п С-AS

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

Почему это?

+0

Это называется общим табличным выражением. Для MS Sql см. Https://technet.microsoft.com/en-us/library/ms190766(v=sql.105).aspx – Serg

+2

Я не вижу попыток обновить 'original_table'. –

+0

«ОБНОВЛЕНИЕ» - это то же самое. Изменяется только 'WITH'. –

ответ

2

Первый пример обновляет temp, который основан на запросе от Original_Table посредством CTE. Базовая таблица обновляется при обновлении CTE. Как поясняется here, CTE составляет в пределах сфера действия заявления UPDATE.

Второй пример запросов Original_Table и сохраняет результат в новую таблицу: #temp. Затем обновляется временная таблица. Нет волшебная память, которая связывает строки в #temp назад к строкам в Original_Table, и вы, вероятно, не захотите этого.

1

Это самое последнее высказывание

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) 

обновляет только некоторые имя таблицы "Темп". В отчете нет ничего, что ссылается Original_Table

+0

в первом случае он обновляет 'Original_Table' –

+0

Да, это так, потому что Original_Table ссылается в инструкции. Ваш первый скрипт - это один единственный оператор - длинное и разумно сложное выражение Common Table, которое выполняет обновление. Второй скрипт состоит из трех операторов: CREATE (temp) TABLE, а затем INSERT, а затем UPDATE. –