SQL Server MERGE + Объединение других таблиц
Я использую оператор MERGE в проекте базы данных для заполнения ссылочных данных из статического набора значений, такого как ниже:
<code> MERGE INTO dbo.[User] AS TARGET USING (VALUES ('[email protected]', 'My Name')) AS SOURCE(UserName, FullName) ON SOURCE.UserName = TARGET.UserName WHEN NOT MATCHED BY TARGET THEN INSERT (UserId, UserName, FullName) VALUES (NEWID(), UserName, FullName); </code>
Проблема возникает, когда я хочу заполнить вторичную таблицу на основе содержимого в других таблицах. Например, моя таблица UserPermission содержит идентификатор пользователя и идентификатор роли, и я хотел бы, чтобы мои статические значения были установлены примерно так («[email protected]», «Admin») и могли присоединиться к User и Permission, чтобы получить Значения идентификатора для ВСТАВКИ. Не уверен, что делать с этим ...
Редактировать:
Таблица пользователей (ID, имя пользователя) 1, John Smith 2, Mark Wahlerg
Таблица ролей (ID, RoleName) 1, Администратор 2, Пользователь 3, Гость
Таблица пользовательских ролей (идентификатор пользователя, идентификатор роли)
Я хочу, чтобы SQL для оператора MERGE корректировал таблицу User-Role таким образом, чтобы я мог указать что-то вроде:
<code>USING(VALUES ('John Smith', 'Administrator'), ('Mark Wahlburg', 'User') </code>
и он присоединится, чтобы определить идентификаторы, вставить комбинации, которые не существуют (и, возможно, удалить те, которые существуют, но не находятся в MERGE.
Решение:
<code>WITH CTE AS ( SELECT UserId, RoleId FROM (VALUES ('John Smith', 'Administrator'), ('Mark Wahlburg', 'User')) AS SOURCE(UserName, RoleName) INNER JOIN User ON SOURCE.UserName = User.UserName INNER JOIN Role ON SOURCE.RoleName = Role.RoleName ) MERGE INTO UserRole AS TARGET USING CTE ON CTE.UserId = TARGET.UserID AND CTE.RoleId = TARGET.UserId WHEN NOT MATCHED BY TARGET THEN INSERT(UserId, RoleId) VALUES(UserId, RoleId) </code>