在SQL Server合并中使用多个匹配条件

31moq8wy  于 2022-11-21  发布在  SQL Server
关注(0)|答案(2)|浏览(275)

此时,源表和目标表具有三列'ID'、'ST'和' ADD '。'ADD'允许空值
在中使用SQL Server merge*语句我要将在源表中所做的更改放到目标中。要求:
1.如果*ID
源中可用,但在目标中不可用,则在目标中插入新行
1.对于源和目标中可用的任何
ID,如果ADD在源中更改,则在目标中插入新行。即,如果 ID=2ADD 更改了两次,则目标中 ID=2 将有三行(原始行+两次更改),因为我们每次都插入新行
1.对于源和目标中均可用的任何ID,如果ST 更改了源中的 * ST ,则应更新目标中匹配 ID 的所有行中 ST 的修改值
1.对于源和目标中均可用的任何 ID
,如果源中的 STADD 均发生了更改,则应为新 ADD插入新行,并应使用更新ST 值更新该 ID 的所有旧行
我可以通过SQL Server合并实现这一点吗?如果不能,我们有什么替代方案?

dtcbnfnu

dtcbnfnu1#

尝试将st作为唯一列合并并更新ID,添加具有多个记录列

MERGE Tablex AS TARGET
USING Vw_tablex AS SOURCE
    ON (TARGET.id = SOURCE.id)
WHEN MATCHED
    AND
    --updates only St column as unique
    target.st <> source.st
    THEN
        UPDATE
        SET
            --- Inserts/updates multiple values in add column 
            TARGET.id = SOURCE.id
            ,TARGET.ADD = Source.ADD
            ,TARGET.st = SOURCE.st
WHEN NOT MATCHED BY TARGET
    THEN
        INSERT (
            id
            ,ADD
            ,st
            )
        VALUES (
            SOURCE.id
            ,source.ADD
            ,source.st
            );
ux6nzvsh

ux6nzvsh2#

MERGE需要主键,您必须以行一对一匹配的方式连接两个表。否则,您将得到类似于以下内容的错误:
MERGE语句试图多次更新或删除同一行.当目的行与多个源行匹配时,会发生这种情况. MERGE语句不能多次更新/删除目的表得同一行.请改进ON子句以确保目的行最多与一个源行匹配,或使用GROUP BY子句对源行进行分组.
第二个要求实际上意味着该键由两列(ID, ADD)组成,并且MERGE语句应该连接这两列:

MERGE INTO DstTable AS Dst
USING
(
    SELECT
        ID
        ,ST
        ,ADD
    FROM SrcTable
) AS Src 
ON  Dst.ID = Src.ID
AND Dst.ADD = Src.ADD
WHEN MATCHED AND Dst.ST <> Src.ST THEN
UPDATE SET
    Dst.ST = Src.ST
WHEN NOT MATCHED BY TARGET THEN
INSERT
    (ID
    ,ST
    ,ADD)
VALUES
    (ID
    ,ST
    ,ADD)
;

此查询几乎完成了您所需的工作。ST值的更新与您所描述的不完全相同。
1.对于源和目标中均可用的任何ID,如果源中只有ST更改,则应在目标中匹配ID的所有行中更新ST的修改值
由于上面的查询在(ID, ADD)上联接,因此ST的修改值不会在target中匹配的ID的所有行中更新,而是在具有匹配的IDADD的一行中更新。
同样,第四个要求也不是您想要的那样。新行将被插入,但是具有相同ID的旧行都不会被更新。
对于ST的这种更新,你需要一个单独的UPDATE语句,或者单独的INSERTUPDATE语句,而不需要MERGE

相关问题