SQL 服务器合并:如果源 table 中的两列不相等,则将它们作为新记录插入目标 table 的一列中

SQL Server merge: If two columns in source table are not equal then insert them as new records in one column of target table

我一直在努力解决一个问题,我需要比较源 table 中的两列,如果不相等,则将它们作为新行合并到第三个 table 中。如果它们相等,则将它们作为一条记录插入,示例如下:

来源Table:

MIN_ID  MAX_ID
  1       1+
  4       2
  3       3
  3       1
  4       1+

期望的目标Table:

    MERGED_ID
     1
     1+
     4
     2
     3
     3
     1
     4
     1+

我尝试使用合并插入匹配值和一个不匹配值,将相同数量的记录插入目标(Source.MIN_ID 或 Source.MAX_ID)

    MERGE into [dbo].[Target] as A
    USING
      [dbo].[Source] as B
        ON
       (B.MIN_ID=B.MAX_ID)

  WHEN MATCHED THEN
    UPDATE SET A.MERGED_ID=B.MAX_ID

WHEN NOT MATCHED THEN
    INSERT
       (A.MERGED_ID)
 VALUES
       (B.MIN_ID)
       )
       ;
   GO

这向目标中插入了 190 万条与源相同的记录(如果相等则 MAX_ID 否则 MIN_ID)。 但是我仍然需要将 Source.MAX_ID 值插入到这个 table 中,如果不等于 Source.MIN_ID 所以我写了另一个类似的合并,它作为一个无休止的查询运行(55 分钟直到我终止查询,目标table 已经有 190 万行。第一次合并用了 13 秒)

    MERGE into [dbo].[Target] as A
    USING
      [dbo].[Source] as B
        ON
       (A.MERGED_ID=B.MAX_ID)

  WHEN MATCHED THEN
    UPDATE SET A.MERGED_ID=B.MAX_ID

WHEN NOT MATCHED THEN
    INSERT
       (A.MERGED_ID)
 VALUES
       (B.MAX_ID)
       )
       ;
   GO

有人可以告诉我做错了什么吗?

通过让事情变得更简单来解决我的问题。第一个查询修改如下

         MERGE into [dbo].[Target] as A
         USING
         [dbo].[Source] as B
          ON
           (B.MAX_ID=A.MERGED_ID)

         WHEN MATCHED THEN
              UPDATE SET A.MERGED_ID=B.MAX_ID

         WHEN NOT MATCHED THEN
             INSERT
                (A.MERGED_ID)
             VALUES
                (B.MIN_ID)
            ;
          GO

然后我使用一个简单的 INSERT INTO SELECT STATEMENT 来填充其他需要的值

    INSERT INTO dbo.Target
       (MERGED_ID)

    SELECT B.MAX_ID     
       FROM dbo.Source as B
       WHERE B.MIN_ID<>B.MAX_ID;

导致 190 万条原始记录加上 45 万条额外记录,其中源 table 中的两列不相等