【问题标题】:Delete from source using MERGE command in SQL Server在 SQL Server 中使用 MERGE 命令从源中删除
【发布时间】:2014-08-09 11:04:40
【问题描述】:

我在 @temptable 中有一个临时表数据,我需要将此数据与表名 LU_BCOMS_UsersRepFamilies 进行比较

通过使用此 @temptable 数据,我需要根据 where 条件将主表 LU_BCOMS_UsersRepFamilies 替换为以下列

1) RepFamily_RepFamilyId 
2) Users_UserId

我的查询如下:

declare @tempTable 
Table(RepFamily_RepFamilyId int,Users_UserId varchar(500),CreatedDate varchar(500),CreatedBy varchar(500))
insert into @tempTable values('676','MV10310','2014-05-20 13:30:29.000','MV10310')

MERGE INTO LU_BCOMS_UsersRepFamilies AS target
USING @tempTable AS source
    ON target.RepFamily_RepFamilyId = source.RepFamily_RepFamilyId
    AND target.Users_UserId = source.Users_UserId
WHEN MATCHED THEN 
    UPDATE SET 
    target.RepFamily_RepFamilyId = source.RepFamily_RepFamilyId,
    target.Users_UserId = source.Users_UserId,
    target.CreatedDate = source.CreatedDate,
    target.CreatedBy = source.CreatedBy
WHEN NOT MATCHED BY TARGET THEN
    INSERT (RepFamily_RepFamilyId, Users_UserId, CreatedDate,CreatedBy)
    VALUES (source.RepFamily_RepFamilyId, source.Users_UserId, source.CreatedDate,source.CreatedBy)
WHEN NOT MATCHED BY SOURCE  THEN
    DELETE  WHERE target.RepFamily_RepFamilyId = source.RepFamily_RepFamilyId and target.Users_UserId = source.Users_UserId;

执行我的查询后,我收到以下错误

错误: 关键字“WHERE”附近的语法不正确。

你能根据上面指定的要求修改我的查询吗

Example : 

    RepFamily_RepFamilyId  Users_UserId  CreatedDate  CreatedBy
    600                         MV10310     date           ravi
    601                         MV10310     date           ravi
    602                         KV110       date           suma
    603                         GV122       date           rajesh

in my temp table I have 

    insert into @tempTable values('600','MV10310','date','ravi')

after merging my master table show look like below :

     RepFamily_RepFamilyId  Users_UserId  CreatedDate  CreatedBy
        600                         MV10310     date           ravi   
        602                         KV110       date           suma
        603                         GV122       date           rajesh

【问题讨论】:

    标签: sql sql-server merge sql-server-2008-r2


    【解决方案1】:

    您的WHERE 进入WHEN NOT MATCHED 行...

    例子:

    WHEN NOT MATCHED BY SOURCE AND SOMEVALUE=5 THEN
    DELETE;
    

    但是....在您上面的代码中,您的WHERE 是:

    WHERE target.RepFamily_RepFamilyId = source.RepFamily_RepFamilyId and target.Users_UserId = source.Users_UserId
    

    与您的USING-ON 相同:

    ON target.RepFamily_RepFamilyId = source.RepFamily_RepFamilyId
        AND target.Users_UserId = source.Users_UserId
    

    因此,如果它是 NOT MATCHED BY SOURCE(从源代码中丢失),您的 where 条件将永远不会满足,也不会删除任何内容...

    我相信你只是想删除 WHERE 如下:

    MERGE INTO LU_BCOMS_UsersRepFamilies AS target
    USING @tempTable AS source
        ON target.RepFamily_RepFamilyId = source.RepFamily_RepFamilyId
        AND target.Users_UserId = source.Users_UserId
    WHEN MATCHED THEN 
        UPDATE SET 
        target.RepFamily_RepFamilyId = source.RepFamily_RepFamilyId,
        target.Users_UserId = source.Users_UserId,
        target.CreatedDate = source.CreatedDate,
        target.CreatedBy = source.CreatedBy
    WHEN NOT MATCHED BY TARGET THEN
        INSERT (RepFamily_RepFamilyId, Users_UserId, CreatedDate,CreatedBy)
        VALUES (source.RepFamily_RepFamilyId, source.Users_UserId, source.CreatedDate,source.CreatedBy)
    WHEN NOT MATCHED BY SOURCE AND target.Users_UserId IN (SELECT DISTINCT Users_UserId FROM @tempTable) THEN 
        DELETE;
    

    【讨论】:

    • 如果我像上面那样写它会删除所有我不希望它发生的记录,它应该删除与User_UserId相关的记录。
    • 就像我说的那样,您可以在WHEN NOT MATCHED BY SOURCE 中添加条件,但我认为您的条件需要重新编写。
    • 我需要如何在 WHEN NOT MATCHED BY SOURCE 中写入条件以删除...通过 RepFamily_RepFamilyId 和 Users_UserId
    • 你能详细解释一下你需要的条件吗?
    • 正如我已经说过的,它应该由 RepFamily_RepFamilyId 和 Users_UserId 删除......当源不匹配时
    【解决方案2】:

    这是答案..

    MERGE INTO LU_BCOMS_UsersRepFamilies AS target
    USING @tempTable AS source
        ON target.RepFamily_RepFamilyId = source.RepFamily_RepFamilyId
        AND target.Users_UserId = source.Users_UserId
    WHEN MATCHED THEN 
        UPDATE SET 
        target.RepFamily_RepFamilyId = source.RepFamily_RepFamilyId,
        target.Users_UserId = source.Users_UserId,
        target.CreatedDate = source.CreatedDate,
        target.CreatedBy = source.CreatedBy
    WHEN NOT MATCHED BY TARGET THEN
        INSERT (RepFamily_RepFamilyId, Users_UserId, CreatedDate,CreatedBy)
        VALUES (source.RepFamily_RepFamilyId, source.Users_UserId, source.CreatedDate,source.CreatedBy)
     WHEN NOT MATCHED BY SOURCE AND  target.Users_UserId = (select top 1 (A.Users_UserId) from @tempTable as A) Then 
     DELETE ; 
    

    【讨论】:

    • 很高兴你把它整理出来,我刚刚发布了更新,这将允许@temptable 中的多个Users_UserId。你的只会删除一个Users_UserId,而留下其余的。
    【解决方案3】:

    尝试更改您的上次删除语句,

    DELETE  source WHERE target.RepFamily_RepFamilyId = source.RepFamily_RepFamilyId and target.Users_UserId = source.Users_UserId;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多