2016-11-29 21 views
0

更新后验证数据我有两个表A和B都没有关系。如何在Oracle

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 

我需要表A来更新列 “old_id” 与来自表B,其中A.OLD_ID = B.OLD_ID相应的 “NEW_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; 
+0

'R_ID'和'S_CD正确的数据类型为联接到其他表'不需要执行更新。你能解释他们为什么包含在你的问题中吗?如果他们不需要,最好删除它们。 – Tony

回答

0

我不明白你为什么要NEW_ID更换OLD_ID当他们是不同的数据类型:OLD_ID是char和NEW_ID是一个整数。

这将是更好的一个新的字段(列)添加到表来存储NEW_ID和更新。

然后,您可以检查旧映射到新的执行是否正确利用的事实,新的ID是使用NEW_ID