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>

Ответы на вопрос(1)

Ваш ответ на вопрос