如下表安排:重構許多一對多關係到多到一個在甲骨文
A - B - C^
其中B爲A和C之間的連接表原來A和C之間的領域關係確實是一對多(許多在A方),我想重構我們的模式以反映這個事實。
是否有可能編寫SQL UPDATE語句將C的所有正確ID插入到A的正確行中(A的每一行都只有一個C ID)?或者是一個必要的程序?
注意:我將接受僅限Oracle的答案,因爲這是此遷移的唯一必需位置。
如下表安排:重構許多一對多關係到多到一個在甲骨文
A - B - C^
其中B爲A和C之間的連接表原來A和C之間的領域關係確實是一對多(許多在A方),我想重構我們的模式以反映這個事實。
是否有可能編寫SQL UPDATE語句將C的所有正確ID插入到A的正確行中(A的每一行都只有一個C ID)?或者是一個必要的程序?
注意:我將接受僅限Oracle的答案,因爲這是此遷移的唯一必需位置。
update tableA
set foreignKeyColumn = (
select columnC
from tableB
where columnA = tableA.columnA
);
實際上看到完整的表結構會使它更容易,但這應該工作。
-- 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;
當然
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)
注爲後人:這是一個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