Еще одна возможность, которая еще не упомянута, - это просто поместить сам оператор SELECT
в CTE, а затем обновить CTE.
;WITH CTE
AS (SELECT T1.Col1,
T2.Col1 AS _Col1,
T1.Col2,
T2.Col2 AS _Col2
FROM T1
JOIN T2
ON T1.id = T2.id
/*Where clause added to exclude rows that are the same in both tables
Handles NULL values correctly*/
WHERE EXISTS(SELECT T1.Col1,
T1.Col2
EXCEPT
SELECT T2.Col1,
T2.Col2))
UPDATE CTE
SET Col1 = _Col1,
Col2 = _Col2
Преимущество этого заключается в том, что оператор SELECT
легко выполнить сам по себе, чтобы сначала проверить правильность результатов, но он требует от вас псевдонимов столбцов, как указано выше, если они имеют одинаковые имена в исходной и целевой таблицах. .
Это также имеет то же ограничение, что и собственный синтаксис UPDATE ... FROM
, показанный в четырех других ответах. Если исходная таблица находится на множестве сторон соединения «один ко многим», то неясно, какая из возможных совпадающих соединенных записей будет использоваться в Update
(проблема, которую MERGE
избегает, вызывая ошибку, если есть попытка обновить одну и ту же строку более одного раза).