删除重复项,并在SQL中重新分配FK值

时间:2017-06-07 19:49:50

标签: sql sql-server

我有两张桌子:

 Table1: 
 [id], [ColA]

 Table2: 
 [id], [Table1Id]

先前的更新导致Table1中的重复项,并且这些重复项与Table2中的行相关联。它在db中看起来像这样:

Table1
1, 89
2, 89

Table2
6, 1
7, 2

我想删除重复项,并将Table2.Table1Id的值重新分配给应该留下的Table1.id行。这可能在一个声明中吗?我见过this post关于如何删除除一个以外的所有内容,但我对如何重新分配Table2.Table1Id值感到迷茫。

编辑:  最终结果应如下所示:

Table1
2, 89

Table2
6, 2
7, 2

1 个答案:

答案 0 :(得分:0)

drop table if exists dbo.Table2;
drop table if exists dbo.Table1;

create table dbo.Table1 (
ID int primary key
, ColA int
);

create table dbo.Table2 (
ID int
, Table1ID int
);

alter table dbo.Table2
add constraint FK_Table2_Table1
foreign key (Table1ID)
references dbo.Table1 (ID);

insert into dbo.Table1 (ID, ColA)
values (1, 89), (2, 89);

insert into dbo.Table2 (ID, Table1ID)
values (6, 1), (7, 2);

drop table if exists #temp;

select
ttt.ID
into #temp
from (
select
    t.ID
    , t.ColA
    , ROW_NUMBER() over (order by t.ID) as Rbr
from dbo.Table1 t
    inner join (
        select
            t.ColA
        from dbo.Table1 t
        group by t.ColA
        having COUNT (t.ID) > 1
    ) tt on t.ColA = tt.ColA
) ttt
where ttt.Rbr > 1

update t2
set
Table1ID = t1i.ID
from #temp t
inner join dbo.Table2 t2 on t.ID = t2.Table1ID
inner join dbo.Table1 t1 on t.ID = t1.ID
inner join dbo.Table1 t1i on t1.ColA = t1i.ColA
        and t1i.ID not in (select t.ID from #temp t)

delete t1
from #temp t
inner join dbo.Table1 t1 on t.ID = t1.ID

select
*
from dbo.Table1 t

select
*
from dbo.Table2 t