【问题标题】:TSQL Merge: When not matched by target then insert if (condition)TSQL合并:当目标不匹配时,插入if(条件)
【发布时间】:2016-05-24 12:56:20
【问题描述】:

我有一个目标表 T 和一个源表 S。

当 S 中有一行不存在于 T 中时,我只想在某些条件为真时将其插入 T 中。

这是我目前的代码:

merge TargetTable as target
using SourceTable as source on (source.Id = target.Id)

when not matched by target then 
    --how to do this:
    -- if exists (source.Name) then delete from source and later perform this insert
    insert ([Id], [Name])
    values (source.[Id], source.[Name])
    ;

name 列是target 表的主键。因此,如果我运行上述查询,则会收到主键违规错误。因此,首先我需要删除目标中的现有名称,然后再插入具有新 ID 的相同名称。

我怎样才能做到这一点?

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    在 MERGE 语句中,因为您正在检查条件 TARGET.Id = SOURCE.Id 并且当您想在插入之前删除 Name 时,TARGET 表中可能不存在相同的 Id。那么,您能否尝试先执行此 MERGE 语句,该语句检查 [Name] 是否存在于 TARGET 表中并将其删除,然后执行您的 MERGE 语句?

    MERGE TargetTable AS TARGET
    USING SourceTable AS SOURCE
    ON (TARGET.Name = SOURCE.Name)
    WHEN MATCHED THEN 
    DELETE;
    GO
    MERGE TargetTable AS TARGET
    USING SourceTable AS SOURCE
    ON (TARGET.Id = SOURCE.Id)
    WHEN NOT MATCHED BY TARGET THEN
    INSERT (Id,Name)
    VALUES(SOURCE.Id,SOURCE.Name);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-09
      • 2016-11-14
      • 2020-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      相关资源
      最近更新 更多