2013-03-13 58 views
1

如下表安排:重構許多一對多關係到多到一個在甲骨文

A - B - C^

其中B爲A和C之間的連接表原來A和C之間的領域關係確實是一對多(許多在A方),我想重構我們的模式以反映這個事實。

是否有可能編寫SQL UPDATE語句將C的所有正確ID插入到A的正確行中(A的每一行都只有一個C ID)?或者是一個必要的程序?

注意:我將接受僅限Oracle的答案,因爲這是此遷移的唯一必需位置。

回答

2
update tableA 
    set foreignKeyColumn = (
     select columnC 
     from tableB 
     where columnA = tableA.columnA 
    ); 

實際上看到完整的表結構會使它更容易,但這應該工作。

+0

注爲後人:這是一個Oracle特定的答案。對於PostgreSQL,請參閱http://stackoverflow.com/questions/12151761/converting-a-many-to-many-relationship-to-one-to-many-in-postgresql?rq=1 – 2013-03-13 14:19:59

2
-- assuming you have tableA (id_a), tableB (id_a,id_c), tableC (id_c) 

alter table tableA add id_c int; 
alter table tableA add constraint foreign key (id_c) references tableC(id_c); 

merge into tableA a 
using tableB b 
on (a.id_a = b.id_a) 
when matched then update set 
    a.id_c = b.id_c; 

commit; 
1

當然

Alter Table C Add FK2A int Null 
Update C Set c.FK2A = 
     (Select FK2A From B 
     Where FK2C = C.PK) 
Alter Table C Alter Column FK2A int Not Null 
Alter Table C Add Constraint FKTableCToA 
       Foreign Key (FK2A) 
       References A (PK)