#sql-server
#sql-сервер
Вопрос:
У меня есть 2 таблицы следующим образом:
таблица1:
ID Date1 Date2
1 2020-04-14 2020-04-06
1 2020-02-12 2020-04-06
1 2020-03-03 2020-04-06
таблица2:
ID Date1 Date2
1 2020-04-16 2020-04-10
1 2020-04-14 2020-04-06
Мне нужно обновить столбец Date2 в table1 с нулевым значением, если строка не соответствует таблице 2. Итак, мой вывод для table1 должен выглядеть следующим образом:
ID Date1 Date2
1 2020-04-14 2020-04-06
1 2020-02-12 NULL
1 2020-03-03 NULL
Сначала я попытался удалить все значения для Date2 в table1 и обновить, используя приведенный ниже код:
UPDATE table1
SET t1.Date2= t2.Date2
FROM table1 t1
JOIN table2 t2 ON t1.Id = t2.Id
AND CAST(t1.Date1 AS DATE) = CAST(t2.Date1 AS DATE)
Но приведенный выше код обновляет все строки для Date2 в table1
Любая помощь приветствуется
Комментарии:
1. Также должны совпадать идентификаторы?
2. Да, идентификаторы должны совпадать
3. В вашем примере данных идентификаторы не совпадают со строкой в Table1, которая не обновляется.
Ответ №1:
Вам нужно LEFT
объединить и обновить несогласованные строки:
UPDATE t1
SET t1.Date2 = null
FROM Table1 t1 LEFT JOIN Table2 t2
ON t2.ID = t1.ID AND t2.Date1 = t1.Date1
WHERE t2.ID IS NULL
Смотрите демонстрацию.
Вы можете сделать то же самое без объединения, с NOT EXISTS
:
UPDATE Table1
SET Date2 = null
WHERE NOT EXISTS (SELECT 1 FROM Table2 t2 WHERE t2.ID = Table1.ID AND t2.Date1 = Table1.Date1)
Смотрите демонстрацию.
Результаты:
> ID | Date1 | Date2
> -: | :--------- | :---------
> 1 | 2020-04-14 | 2020-04-06
> 1 | 2020-02-12 | null
> 1 | 2020-03-03 | null
Комментарии:
1. Мне не нужно было последнее условие для date2 для предложения on. В остальном работает идеально, спасибо.
2. @user10 проверьте также, что запрос с НЕ СУЩЕСТВУЕТ. Это могло бы работать лучше.