SQL Server合并+加入其他表(SQL Server MERGE + Joining othe

2019-06-24 07:18发布

我使用的数据库项目中的MERGE语句来填充从一个静态值设定的基准数据,如下面的以下内容:

    MERGE INTO dbo.[User] AS TARGET
USING (VALUES
    ('me@somewhere.com', '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);

这个问题是在当我想以在其他表的内容来填充辅助表。 例如,我的UserPermission表中包含用户ID和角色ID,我想我的静态值设置为像(“me@somewhere.com”,“管理员”),并能够加盟用户和权限,以获得用于插入ID值。 不知道在哪里做的是...

编辑:

用户表(ID,用户名)1,约翰·史密斯2,马克Wahlerg

角色表(ID,角色名)1,管理员2,用户3,访客

用户 - 角色表(用户ID,角色ID)

我想要对MERGE语句SQL调整用户角色表,这样我可以做规定是这样的:

USING(VALUES
 ('John Smith', 'Administrator'),
 ('Mark Wahlburg', 'User')

它将加入到确定的ID,插入不存在(也许删除做好些,但不是在合并组合。

解:

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)

Answer 1:

Merge支持的CTE所以也许你可以用这个作为源,结合您的静态数据,并进行CTE内的任何连接。



文章来源: SQL Server MERGE + Joining other tables