【问题标题】:Using multiple match criteria in SQL server merge在 SQL Server 合并中使用多个匹配条件
【发布时间】:2017-06-14 09:08:10
【问题描述】:

此时源表和目标表具有三列“ID”、“ST”和“ADD”。 'ADD' 允许为空

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

  1. 如果 ID 在源中可用但在目标中不可用,则 插入 一个新的 目标中的行
  2. 对于源和目标中可用的任何 ID,如果 只有 ADD 是 在源中更改,然后在目标中插入新行。即如果 ADDID=2 更改了两次,然后我们将在目标中为 ID=2 设置三行(原始 + 两次更改),因为我们每次都插入新行 时间
  3. 对于源和目标中可用的任何 ID,如果ST 源中的更改,然后 ST 的修改值应更新 目标中匹配 ID 的所有行
  4. 对于任何ID在源和目标中都可用,如果STADD 源中的更改,然后应该为新的 ADD插入新行,并且应该为该 更新所有旧行ID 更新值为ST

我可以通过 SQL Server 合并来实现这一点吗?如果没有,我们有什么替代方案?

【问题讨论】:

  • 据我所知,MERGE只能给你when matchwhen not match,意思是只能区分1和其余,不能区分2、3,或 4.
  • 有可能,您是否在目标表上定义了任何主键。您希望 ST 列是唯一的吗?
  • @BHouse 在源表中的“ID”是主键。它适用于它,因为信息仅在源表中更新。由于我们想在目标中为相同的“ID”插入多条记录,因此目标表将具有单独的列作为主键,即“TargetID”。 ST也不是唯一的。它将具有值“A”或“I”。

标签: sql sql-server


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    由于上面的查询连接(ID, ADD)ST 的修改值不会在目标中匹配ID 的所有行中更新,而是在匹配ID 的一行中更新和强>ADD.

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

    对于ST 的此类更新,您需要单独的UPDATE 语句。或者将 INSERTUPDATE 语句分开,而根本没有 MERGE

    【讨论】:

      猜你喜欢
      • 2016-11-29
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多