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