Реальные данные имеют больше столбцов. Образец целевой таблицы имеет поле уникального идентификатора. Поля данных имеют существующие данные. Необходимо обновить записи, но обновляются только некоторые поля.
-- Original/target table
DECLARE @target TABLE (
ID varchar(4) NOT NULL,
x int NULL,
y int NULL,
z int NULL );
INSERT INTO @target (ID, x, y, z)
VALUES ('A1', NULL, 2, 3),
('A2', 1, 2, NULL),
('C4', 1, 2, 3),
('Z5', 1, 2, 3)
;
--- Updates needed:
DECLARE @updates TABLE (
ID varchar(4) NOT NULL,
x int NULL,
y int NULL,
z int NULL );
INSERT INTO @updates (ID, x, y, z)
VALUES ('A1', NULL , 101, NULL),
('A2', 201, NULL, NULL),
('C4', NULL, NULL, 40),
('Z5', NULL, NULL, 99999)
Мне нужно, чтобы пользователи отправляли мне обновления данных, которые я буду использовать для обновления / слияния с целевой таблицей. Пользователь может обновить определенные поля, но не другие поля. Поэтому, когда исходная таблица имеет значение, мне нужно обновить соответствующее поле назначения, но оставить остальные поля (которые являются нулевыми в источнике) без изменений. Изменяйте целевое поле, только если оно явно указано (не ноль) в источнике.
Например, исходная запись с ID = A1 имеет обновленное значение для "y", равное 101. После объединения мне нужно, чтобы целевая запись для A1 содержала: NULL, 101, 3
Мне также нужен способ «очистить» запись в цели. Я подумал, что, возможно, можно будет использовать специальное значение для данных, таких как «99999», показанное в записи с идентификатором Z5. Если источником является «99999», тогда установите целевое поле в NULL.
Я не буду добавлять какие-либо записи, только совпадающие с существующими идентификаторами в цели.
UPDATE:
Это решение, объединенное из обоих ответов, похоже, работает:
update t
set x = coalesce(u.x, t.x),
y = coalesce(u.y, t.y),
z = coalesce(u.z, t.z)
from @target t join
@updates u
on t.id = u.id;
update t
set
x = NULLIF(ISNULL(u.x,t.x),'99999'),
y = NULLIF(ISNULL(u.y,t.y),'99999'),
z = NULLIF(ISNULL(u.z,t.z),'99999')
from @target t join
@updates u
on t.id = u.id;
select * from @target