oracle 批量更新之將一個表的數據批量更新至另一個表


oracle 批量更新之將一個表的數據批量更新至另一個表

CreationTime--2018年7月3日17點38分

Author:Marydon

Oracle 將一個表的指定字段的值更新至另一個表的對應字段

案例一:

1.情景描述

  testdata表數據展示

  testdata2表數據展示

  數據對比:

  testdata表有31條數據,且有9條數據的userid與testdata2表不一致(自己獨有);

  testdata2表有24條數據,且有2條數據的userid與testdata2表不一致(自己獨有)。

  表關聯:testdata表和testdata2表的userid具有關聯關系

  需求說明:

  需要將testdata中的22條數據更新到testdata2表中   

2.錯誤方式

  這種方式,由於沒有設置更新的限制條件,導致:

  不僅會更新需要更新的表記錄,還會將testdata2中剩余的數據字段更新為空。

  

 

3.解決方案

  添加where條件,只對兩表共有的數據進行更新。

  2018/12/05

  正確格式:

UPDATE TABLE1 T1
   SET (T1.COLUMN1, T1.COLUMN2) =
       (SELECT T2.COLUMN1, T2.COLUMN2 FROM TABLE2 T2 WHERE T2.ID = T1.ID) --兩表能夠進行關聯的字段(一般是主鍵)
 WHERE EXISTS (SELECT 1 FROM TABLE2 T2 WHERE T2.ID = T1.ID);

  錯誤格式:

UPDATE TABLE1 T1
   SET (T1.COLUMN1, T1.COLUMN2) =
       (SELECT T2.COLUMN1, T2.COLUMN2 FROM TABLE2 T2 WHERE T2.ID = T1.ID)
 WHERE EXISTS (SELECT 1 FROM TABLE1 T1 WHERE T1.ID = T2.ID);--exists()訪問不到t2表

  說明:雖然理論上,它們執行效果是一樣的,但是由於exists()函數訪問不到t2表,所以查詢訪問不到的那張表t2。

  套用

--添加限制條件,進行更新
update testdata2 t2
   set (t2.usercode, t2.userpassword) =
       (select t.usercode, t.userpassword
          from testdata t
         where t.userid = t2.userid)
 where exists (select 1 from testdata t where t.userid = t2.userid);

 

  避免了全表更新。 

  2018/12/07

案例二:

4.索引的重要性

  更新1w條以上的數據時,where后面跟的條件一定要加上索引,不然哭都來不及。

  需要更新22w條數據,兩張表的ID_CARD字段沒有建索引

   兩張表的ID_CARD字段建立索引后

  這是我的親身經歷,沒有建索引前,執行了4個小時,沒有更新完,后來由於電腦關機,導致任務終止;

  建索引后,同樣執行該sql,更新22w條數據只用了4秒!!!  

說明:對於要執行的更新sql,使用plsql的預測功能時預測不准確,只做參考。

2019/01/10

案例三:

  將VIRTUAL_CARD表中的ADDRESS字段數據更新至TEST_CARD表中的ADDRESS字段

  方式一:sql實現

UPDATE TEST_CARD T
   SET T.ADDRESS =
       (SELECT T2.ADDRESS FROM VIRTUAL_CARD T2 WHERE T.CARDNUM = T2.CARDNUM)
 WHERE EXISTS (SELECT 1 FROM VIRTUAL_CARD T2 WHERE T2.CARDNUM = T.CARDNUM)

  方式二:借助plsql工具

  將要更新的表的rowid查詢出來,並獲取最后頁

 

  編輯數據--》選中Address字段所有數據

  右鍵--》復制--》選中第一列的Address所有數據--》粘貼

  勾選上圖綠色勾,提交即可。

  說明:

  大批量修改數據時,推薦使用方式一更新;

  少量數據修改時,兩種方式均可。

5.總結

  A表中有幾個字段的值需要批量更新,如果一個一個進行修改,太慢了:

  將批量修改后的內容放到一個新的表中B,並與要更新的表A建立關聯關系。

  第一步:建新表

  兩表關聯字段(column1):A表中該字段必須具有唯一性;

  要更新的字段(column5,cloumn6,...)。

  第二步:導數據

  將新表字段及每條記錄更新后內容放到excel中,導入oracle數據庫中B表。

  第三步:根據兩表關聯關系,將B表數據批量更新到A表中。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM