【问题标题】:SQL Server MERGE + Joining other tablesSQL Server MERGE + 加入其他表
【发布时间】:2012-05-18 08:49:28
【问题描述】:

我在数据库项目中使用 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, RoleName) 1、管理员 2、用户 3、客人

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

我希望 MERGE 语句的 SQL 调整 User-Role 表,以便我可以指定如下内容:

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 而不是更简单的INSERT ... SELECT?我并不是说你不能用MERGE 做到这一点,但对于这样一个微不足道的操作来说似乎有点过分了。
  • @AaronBertrand,这是一个简单的例子,通常我有多行并使用 MERGE 的 UPDATE 和 DELETE 功能。我试图找出问题所在。
  • 问题出在您的USING 子句中。你那里只有硬编码的值;如果您需要从表格中提取这些值,您需要它实际使用SELECT。还有一些非常聪明的人可以帮助解决您的问题,但他们对解决您的实际问题更感兴趣 - 将其简化只会导致像我问的那样不必要的问题。
  • 我看不到不通过将“值(...)”行删除为“选择”来更改插入的原因,其中包括您的静态字段并连接到其他表以查看补上相关的id。
  • 这些值是硬编码的,但问题是我不想插入那些特定的值,而是根据硬编码值从其他表中插入 ID。该示例是现在可以使用的示例。问题正在采取下一步措施,也就是后文描述的问题。

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


【解决方案1】:

Merge 支持 CTE,因此也许您可以将其用作源,组合您的静态数据并在 cte 中执行任何联接。

【讨论】:

  • 这就是诀窍。我在 CTE 和表值构造函数方面的经验有点薄弱,因此我不知道它们可以在哪里使用(以及一起使用)。
猜你喜欢
  • 1970-01-01
  • 2014-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多