2016-11-29 17 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