【发布时间】:2016-11-30 07:55:20
【问题描述】:
我有两个不相关的表 A 和 B。
SQL> select * from A;
OLD_ID R_ID
---------- ----------
TA-BC 1
TB-BC 2
TC-BC 3
TD-BC 4
TE-BC 5
TF-BC 6
TG-BC 7
8
SQL> select * from B;
NEW_ID OLD_ID S_CD
---------- ---------- -----
1 TA-BC A
2 TB-BC B
3 TC-BC C
4 TD-BC A
5 TE-BC B
6 TF-BC F
7 TG-BC C
8 TH-BC B
我需要使用表 B 中的相应“new_id”值更新表 A 中的列“old_id”,其中 A.OLD_ID = B.OLD_ID。
我写了类似下面的东西。表 A 和 B 中的数据大约有 100 万条记录,我在上面给出的记录是样本数据。由于数据量很大,所以每 25k 条记录更新一次并循环提交。
DECLARE
v_cnt number := 1;
BEGIN
WHILE v_cnt > 0 LOOP
UPDATE /*+ parallel(A 10) */ A a
SET a.old_id =
(SELECT DISTINCT new_id
FROM B b
WHERE b.old_id = a.old_id)
WHERE EXISTS
(SELECT 1
FROM B b1
WHERE b1.old_id = a.old_id and ROWNUM < 25000;
v_cnt := SQL%ROWCOUNT;
COMMIT;
END LOOP;
END;
/
我想知道如何打印更新了多少记录以及如何验证表 A 中的所有记录是否与表 B 中具有 old_id 的匹配记录已正确更新。我可以在更新语句之前/之后编写什么查询来验证表 A“old_id”列是否已使用表 B“new_id”列中的值正确更新
下面是建表脚本。
create table A(old_id varchar2(10),r_id number);
insert into A values ('TA-BC',1);
insert into A values ('TB-BC',2);
insert into A values ('TC-BC',3);
insert into A values ('TD-BC',4);
insert into A values ('TE-BC',5);
insert into A values ('TF-BC',6);
insert into A values ('TG-BC',7);
insert into A(r_id) values(8);
commit;
create table B(new_id number,old_id varchar2(10),s_cd varchar2(5));
insert into B values (1,'TA-BC','A');
insert into B values (2,'TB-BC','B');
insert into B values (3,'TC-BC','C');
insert into B values (4,'TD-BC','A');
insert into B values (5,'TE-BC','B');
insert into B values (6,'TF-BC','F');
insert into B values (7,'TG-BC','C');
insert into B values (8,'TH-BC','B');
commit;
【问题讨论】:
-
R_ID和S_CD不需要执行更新。您能解释一下为什么它们会包含在您的问题中吗?如果不需要它们,最好删除它们。
标签: sql oracle plsql oracle11g