我有两张不相关的表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中具有old_id的匹配记录的表A中的所有记录是否已正确更新。我可以在update语句之前/之后编写什么查询来验证表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;
答案 0 :(得分:0)
我不明白为什么当他们使用OLD_ID
时,替换 NEW_ID
的数据类型不同:OLD_ID
是char和NEW_ID
是一个整数。
最好将新字段(列)添加到表中以存储NEW_ID
并更新。
然后,您可以检查已正确执行旧映射到新映射和利用新id是使用NEW_ID
<连接到其他表的正确数据类型这一事实/ p>