在Oracle中重构多对多关系到多对一关系

时间:2013-03-13 14:02:12

标签: sql oracle

鉴于以下表格安排:

A - B - C

其中B是A和C之间的连接表。事实证明A和C之间的域关系确实是一对多(A方面很多),我想重构我们的模式以反映这一事实。

是否可以编写SQL UPDATE语句将C的所有正确id插入到A的正确行中(A的每一行只有一个C id)?或者是必要的程序?

注意:我将接受仅限Oracle的答案,因为这是唯一需要迁移的地方。

3 个答案:

答案 0 :(得分:2)

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

实际上看到完整的表格结构会让它变得更容易,但这应该可行。

答案 1 :(得分: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;

答案 2 :(得分: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)