【问题标题】:SQL Merge Duplicate Values in Table and Related Mapping TableSQL合并表和相关映射表中的重复值
【发布时间】:2018-08-28 15:30:37
【问题描述】:

我有两张桌子。一个是父数据表,另一个是映射表,用于实现该父数据表与主表之间的多对多关系。我的问题是父表和映射表具有需要合并的重复值。我似乎可以从父表中删除重复项,但映射表需要以相同的方式合并重复数据。映射表上有一个 FK 和相关的级联删除/更新。如何确保来自以下语句的合并也反映在映射表中?

之前

父表_A

| ID   | ProductName | MFG_ID  |
|------+-------------+------------+
|  1   |  ACME_123   |    123     |
|  2   |  ACME_123   |    456     |

映射表

| ID   | MainRecordID | ParentTable.MFG_ID|
|------+--------------+-----------------------+
|  1   |      1       |          123          |
|  2   |      2       |          456          |

希望之后

父表_A

| ID   | ProductName | MFG_ID|
|------+-------------+------------+
|  1   |  ACME_123   |    123     |

映射表

| ID   | MainRecordID | ParentTable.MFG_ID|
|------+--------------+-----------------------+
|  1   |      1       |          123          |
|  2   |      2       |          123          |

用于合并 Table_A 重复项的建议代码

MERGE Table_A
USING
(
SELECT 
MIN(ID) ID,
ProductName,
MIN(MFG_ID) MFG_ID,
FROM Table_A
GROUP BY ProductName
) NewData ON Table_A.ID = NewData.ID
WHEN MATCHED THEN 
UPDATE SET
Table_A.ProductName = NewData.ProductName
WHEN NOT MATCHED BY SOURCE THEN DELETE;

【问题讨论】:

    标签: sql-server tsql merge duplicates


    【解决方案1】:

    将其拆分为两个单独的语句,包装在显式事务中而不是合并中。像这样的:

    declare @src table
    (
        Id int,
        ProductName varchar(128),
        MFG_ID int
    )
    set xact_abort on
    
    insert into @src
    select
        Id = min(ID),
        ProductName = ProductName,
        MFG_ID = MIN(MFG_ID) ,
    from Table_A
    group by ProductName
    
    begin tran
    
        delete o
        from Table_A o
        where not exists
        (
            select 1
            from @src i
            where o.id = i.id
        )
    
        update t
        set ProductName = s.ProductName
        from Table_A t
        inner join @Src s
            on t.Id = s.Id
    
    commit tran
    

    【讨论】:

      猜你喜欢
      • 2014-04-27
      • 2012-11-15
      • 2014-09-08
      • 2017-05-10
      • 1970-01-01
      • 2011-11-15
      • 2015-11-23
      • 1970-01-01
      • 2021-11-25
      相关资源
      最近更新 更多