После прочтения вопроса и всех комментариев вы действительно хотите
UPDATE
строка, основанная на id
с date
и name
, но установите name
на NULL
, когда нет совпадений, и установите date
на максимальную дату в в то же время с этим условием.
UPDATE
с новыми значениями (name
, date
) при совпадении на id
Я использовал табличную переменную для простоты, но концепция
то же самое.
С учетом таблицы и данных это дает:
DECLARE @targetTable TABLE (id int,date datetime,name varchar(50));
DECLARE @sourceTable TABLE (id int,date datetime,name varchar(50));
INSERT INTO @targetTable
VALUES
(1,'1905-07-08 00:00:00.000','John'),
(2,'1905-07-08 00:00:00.000','Albrt'),
(3,'1905-07-08 00:00:00.000','Roy');
INSERT INTO @sourceTable values(1,'1905-07-09 00:00:00.000','jame');
SELECT id,date,name FROM @targetTable;
SELECT id,date,name FROM @sourceTable;
id date name
1 1905-07-08 00:00:00.000 John
2 1905-07-08 00:00:00.000 Albrt
3 1905-07-08 00:00:00.000 Roy
id date name
1 1905-07-09 00:00:00.000 jame
То, что вы хотите, в основном совпадает с этим утверждением select:
SELECT
t.id,
CASE
WHEN s.id IS NOT NULL THEN s.[date]
ELSE (SELECT MAX([date]) FROM @sourceTable )
END AS [date],
CASE
WHEN s.id IS NULL THEN NULL
ELSE s.name
END AS [name]
FROM @targetTable AS t
LEFT OUTER JOIN @sourceTable AS s
ON t.id = s.id;
ТАК, чтобы сделать это, мы можем включить это в обновление:
UPDATE @targetTable
SET [date] = CASE
WHEN s.id IS NOT NULL THEN s.[date]
ELSE (SELECT MAX([date]) FROM @sourceTable )
END,
[name] = CASE
WHEN s.id IS NULL THEN NULL
ELSE s.name
END
FROM @targetTable AS t
LEFT OUTER JOIN @sourceTable AS s
ON t.id = s.id;
Конечный выход
SELECT id,date,name FROM @targetTable;
id date name
1 1905-07-09 00:00:00.000 jame
2 1905-07-09 00:00:00.000 NULL
3 1905-07-09 00:00:00.000 NULL