使用SQL Server中的MERGE命令从源中删除

时间:2014-06-19 01:56:59

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

我在@temptable中有临时表数据我需要将这些数据与表名LU_BCOMS_UsersRepFamilies进行比较

使用这个@temptable数据我需要在主表LU_BCOMS_UsersRepFamilies中根据where条件替换以下列

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

3 个答案:

答案 0 :(得分:0)

您的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,如下所示:

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;

答案 1 :(得分:0)

这是答案..

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 ; 

答案 2 :(得分:0)

尝试更改上次删除声明,

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