2017-06-07 7 views
0

にFKの値を再割り当て私は2つのテーブルた:は重複を削除し、SQL

Table1: 
[id], [ColA] 

Table2: 
[id], [Table1Id] 

前回の更新は、表1における重複及び表2の行とassocatedするもの重複を引き起こしました。それはデシベルで次のようになります。

Table1 
1, 89 
2, 89 

Table2 
6, 1 
7, 2 

私は残すべき1つのTable1.id行にTable2.Table1Idの値を重複を削除して再割り当てしたいと思います。これは単一のステートメントで可能ですか?私はthis postを1つ以外のすべてを削除する方法を見ましたが、Table2.Table1Idの値をどのように再割り当てするかは分かりません。

編集: 最終的な結果は次のようになります。

Table1 
2, 89 

Table2 
6, 2 
7, 2 
+0

のでtable1.colaの値もユニークですか? – SQLChao

+0

いいえ、ColAは私が取り除こうとしている重複を表していますが、重複を削除すると一意でなければなりません。 –

+0

私が意味したのは、すべてが固定されているときでした。ColAはユニークになります。 – SQLChao

答えて

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