SQL合并表和相关映射表中的重复值

时间:2018-03-19 22:52:52

标签: sql-server tsql merge duplicates

我有两张桌子。一个是父数据表,另一个是用于实现此父数据表和主表之间的多对多关系的映射表。我的问题是父表和映射表具有需要合并的重复值。我似乎可以从父表中删除重复项,但映射表需要以相同的方式合并重复数据。映射表上有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;

1 个答案:

答案 0 :(得分:0)

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

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