SSMS выбирает одну и ту же строку из двух таблиц

#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 проверьте также, что запрос с НЕ СУЩЕСТВУЕТ. Это могло бы работать лучше.