小弟正在研究procedure,有一个问题需要解决
create table TableA (
A_id number ,
name varchar2(1024) ,
uuid varchar2(36) ,
version varchar2(50),
MMMM varchar2(40),
NNNN varchar2(50),
B_id number , // 新加的字段,全部为空
primary key (A_id)
);
create table TableB (
B_id number ,
name varchar2(1024) ,
uuid varchar2(36),
version varchar2(50),
primary key (B_id)
);
TableA 是一张已经存在的表,里面有约 10 万条数据。 现在建一张新表 TableB, 表之间的关系是这样的。B_id将作为 TableA 的外键。
TableA 的数据中 uuid + version 的配对有很多是重复的,现在要把 重复的数据 提取到 TableB 里面。
现在需要写一个 procedure ,首先扫描 TableA, 将 unique( uuid + version ) 的数据写到 TableB 里面,然后在回过来将 B_id 填入到 TableA 中。
希望各位大虾帮忙。
------解决方案--------------------
- SQL code
--创建表create table TableA ( A_id number , name varchar2(1024) , uuid varchar2(36) , version varchar2(50), MMMM varchar2(40), NNNN varchar2(50), B_id number , --新加的字段,全部为空 primary key (A_id));--插入数据insert into TableA(a_id, uuid, name, version) values(1, 'uid1', 'abc', 'version_1');insert into TableA(a_id, uuid, name, version) values(2, 'uid1', 'abc', 'version_1');insert into TableA(a_id, uuid, name, version) values(3, 'uid1', 'abc', 'version_1');insert into TableA(a_id, uuid, name, version) values(4, 'uid1', 'abc', 'version_1');insert into TableA(a_id, uuid, name, version) values(5, 'uid1', 'abc', 'version_1');insert into TableA(a_id, uuid, name, version) values(6, 'uid2', 'abcd', 'version_2');commit;--数据更新merge into TableA ausing (select t.*, rownum as b_id from (select uuid, version from TableA group by uuid, name, version) t) b on (a.uuid = b.uuid and a.version = b.version) when matched thenupdate set a.b_id = b.b_id;commit;--数据查询select * from TableA; A_ID NAME UUID VERSION MMMM NNNN B_ID---------- -------------- ------------ -------------- -------------- -------------- ---------- 1 abc uid1 version_1 1 2 abc uid1 version_1 1 3 abc uid1 version_1 1 4 abc uid1 version_1 1 5 abc uid1 version_1 1 6 abcd uid2 version_2 2
------解决方案--------------------
由于没有数据库工具,大概写了下,可能有错误,只是个思路,你可以试试
- SQL code
create or replace procedure A asbegininsert into TableB (B_id, name, uuid, version)select rownum as B_id, name, uuid, version from(select distinct d.name, d.uuid, d.version from TableA);update TableA set B_id = (select B_id from TableB where TableB.uuid = TableA.uuid and TableB.version = TableA.version);end;