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

时间:2017-06-14 09:08:11

标签: sql sql-server

此时,源表和目的地表有三列“ID'”,“ST' ST'并且'添加'。 ' ADD'允许null

使用 SQL Server合并 语句我希望将源表中所做的更改放到目标位置。 要求:

  1. 如果 ID 在源文件中可用但在目标中不可用,则插入一个新的 目标行
  2. 对于源和目标中可用的任何 ID ,如果 ADD ,则 在源中更改,然后在目标中插入新行。即如果 ADD ID = 2 更改了两次,然后我们将在目标中为 ID = 2 创建三行(原始+两次更改),因为我们每次都插入新行 时间
  3. 对于源和目标中均可用的任何 ID ,如果 ST 源代码中的更改然后 ST 的修改值应更新 目标
  4. 中匹配 ID 的所有行
  5. 对于源代码和目标中可用的任何 ID ,如果 ST 和 源代码中 ADD 更改,新 ADD 的新行应插入,并且应为该更新所有旧行ID 更新值为 ST
  6. 我可以通过SQL Server合并实现这一目标吗?如果没有,我们有哪些替代方案?

2 个答案:

答案 0 :(得分:0)

尝试将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
            );

答案 1 :(得分:0)

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更改   源然后修改ST的值应该在所有行中更新   目标中的匹配ID
  2.   

由于上面的查询加入了(ID, ADD),因此ST的修改后的值不会更新为目标中匹配ID的所有行,而是匹配{{1}的一行} ID

同样,第四个要求并不是你想要的。将插入新行,但不会更新具有相同ADD的旧行。

对于ID的此类更新,您需要单独的ST声明。或者单独UPDATEINSERT语句,而不是UPDATE