Перемещение данных между полями в целевой таблице в T-SQL MERGE - PullRequest
1 голос
/ 06 октября 2011

У меня есть оператор SQL MERGE, который выполняет UPDATE, если значение существует (и INSERT, если оно существует). Я хотел бы записать последние несколько «исторических» значений в строке, когда произойдет ОБНОВЛЕНИЕ, примерно так:

MERGE into desttable as dest
USING sourcetable as src
on src.ref = dest.ref

WHEN MATCHED THEN
UPDATE SET dest.oldvalue3=dest.oldvalue2, 
dest.oldvalue2=dest.oldvalue1, 
dest.oldvalue1=dest.value, 
dest.value=src.newvalue

WHEN NOT MATCHED THEN
INSERT ...

... так что, по существу, существующее «значение» перемешивается до «oldvalue1», «oldvalue1» становится «oldvalue2» и т. Д. Однако, когда я запускаю это, каждый столбец получает значение «value» - оператор UPDATE очевидно устанавливает все поля одновременно. Есть ли способ добиться того, что я пытаюсь сделать?

1 Ответ

2 голосов
/ 06 октября 2011

Вы можете left outer join desttable в предложении using и использовать столбцы от desttable в качестве источника для обновления.

MERGE INTO desttable AS dest
USING (SELECT s.ref,
              s.newvalue,
              d.oldvalue2,
              d.oldvalue1,
              d.value 
       FROM sourcetable AS s
         LEFT OUTER JOIN desttable AS d
           ON s.ref = d.ref) AS src
ON src.ref = dest.ref
WHEN MATCHED THEN
UPDATE SET dest.oldvalue3=src.oldvalue2, 
           dest.oldvalue2=src.oldvalue1, 
           dest.oldvalue1=src.value, 
           dest.value=src.newvalue
;

http://data.stackexchange.com/stackoverflow/q/114412/

...