Оператор объединения SQL Server возвращает ноль, если для идентификатора нет записи - PullRequest
2 голосов
/ 16 мая 2019

Я использую оператор слияния, чтобы обновить количество пройденных курсов в таблице ModuleEnrollment. Это работает, но если курс удален из Employee, он все равно остается на прежнем уровне. Есть ли способ включить в состояние слияния, чтобы возвратить 0 для любого EmployeeID, не включенного в таблицу CoursesComplete.

 MERGE [dbo].[ModuleEnrollment] as ME
 USING  [dbo].[CoursesComplete]AS CC
 ON ME.[EmployeeID] = CC.[EmployeeID] AND ME.[ModuleID] = CC.[ModuleID]
 WHEN MATCHED THEN
      UPDATE SET ME.[CoursesComplete]=CC.[CoursesComplete]
 WHEN NOT MATCHED BY TARGET THEN
      INSERT([EmployeeID],[ModuleID],[CoursesComplete]) VALUES(CC. 
[EmployeeID],CC.[ModuleID],CC.[CoursesComplete]);

GO

1 Ответ

1 голос
/ 16 мая 2019

Вы просто должны добавить:

WHEN NOT MATCHED BY SOURCE THEN 
    UPDATE SET ME.[CoursesComplete]=0

Весь запрос:

;MERGE [dbo].[ModuleEnrollment] as ME
 USING  [dbo].[CoursesComplete]AS CC
 ON ME.[EmployeeID] = CC.[EmployeeID] AND ME.[ModuleID] = CC.[ModuleID]
 WHEN MATCHED THEN
      UPDATE SET ME.[CoursesComplete]=CC.[CoursesComplete]
 WHEN NOT MATCHED BY TARGET THEN
      INSERT([EmployeeID],[ModuleID],[CoursesComplete]) VALUES(CC. 
[EmployeeID],CC.[ModuleID],CC.[CoursesComplete])
WHEN NOT MATCHED BY SOURCE THEN 
        UPDATE SET ME.[CoursesComplete]=0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...