sql-server - SQL Server MERGE + 连接其他表

标签 sql-server tsql merge common-table-expression sql-merge

我在数据库项目中使用 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', 'Admin') 并能够加入用户和权限以获得用于插入的 ID 值。不知道在哪里做...

编辑:

用户表(ID、用户名) 1、约翰·史密斯 2、马克·沃勒格

角色表(ID、角色名称) 1、管理员 2、用户 3、嘉宾

用户角色表(用户 ID、角色 ID)

我希望 MERGE 语句的 SQL 调整用户角色表,以便我可以指定如下内容:

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

它将连接以确定 ID,插入不存在的组合(并且可能删除存在但不在 MERGE 中的组合。

解决方案:

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)

最佳答案

Merge 支持 CTE,因此也许您可以使用它作为源,组合静态数据并在 cte 内执行任何联接。

关于sql-server - SQL Server MERGE + 连接其他表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10522855/

相关文章:

mysql - INSERT ... ON DUPLICATE KEY UPDATE(要比较的两个键)

sql - 如何为每个公司的每种产品类型获得最便宜的产品?

mysql - 从 MSSQL 转换为 MySQL

java - 声明输出参数并像查询结果、T-SQL、JAVA 一样选择它

sql - 获得有条件的连续天数

php - 合并两个数组,将重叠的结果相加

svn - SVN对mergeinfo的实际用途是什么?

sql-server - SQL Server 索引 - 索引中包含哪些列?

R合并三个数据框而不形成笛卡尔积

c# - 将 Excel 数据导入数据库