以A表中的值快速更新B表中記錄的方法

2022-04-29 13:15:10 字數 1791 閱讀 1479

1、問題描述

有兩張表,a表記錄了某些實體的新屬性,b表記錄了每個實體的舊屬性,現在打算用a中的屬性值去更新b中相同實體的舊屬性,如下圖所示:

類似這樣的需求,怎樣做比較高效呢?

2、製作模擬資料

為了便於說明及進行效率對比,首先我們來製作一些模擬資料。在oracle資料庫中,模擬資料的製作分如下三步:

建立資料表

createtablea (tbbh number,dlbm varchar2(3));

createtableb (objectid number,tbbh number,dlbm varchar2(3));

製作模擬資料,a表插入10000行記錄,b表插入100000行記錄

insertintoa selectrownumtbbh ,dbms_random.string('u',3) fromdual connectbylevel<10000;

insertintob selectrownumobjectid ,rownumtbbh ,dbms_random.string('u',3) fromdual connectbylevel<100000;

commit;

檢視實體的原始屬性值與目標屬性值

3、常規解決辦法

常規解決思路:從a表中每讀出一條記錄,去b表更新對應實體的屬性值。用一段儲存過程來模擬這個問題為:

begin

forx in(selecttbbh,dlbm froma)

loop

updateb setb.dlbm=x.dlbm whereb.tbbh=x.tbbh;

endloop;

commit;

end;

在b表tbbh欄位未建立索引的情況下,耗時約17.95s。

在b表tbbh欄位建立索引的情況下,耗時約1.18s。

4、優化解決辦法

常規辦法是逐條進行更新,那可不可以進行批量的更新呢?答案是肯定的。我們可以這樣操作。

在a表的tbbh欄位上建立主鍵約束

altertablea addprimarykey(tbbh) usingindex;

對a、b表的聯合檢視進行更新

update(selectb.tbbh ,a.dlbm adlbm ,b.dlbm bdlbm froma,b wherea.tbbh=b.tbbh ) setbdlbm=adlbm;

使用該方法,在b表tbbh欄位未建立索引的情況下,耗時約0.96s。

使用該方法,在b表tbbh欄位建立索引的情況下,耗時約0.54s。

5、效率對比

b表tbbh無索引

b表tbbh有索引

常規方法

17.95s

1.18s

優化方法

0.96s

0.54s

很顯然,優化後的方法,其效能有較大程度的提公升。

SQL抽取 A表中不含B表中的記錄 多列比較

t3m data表中的資料如下 gzd bh,nsrsbh,bh 001 43122741 1 002 43122742 2 003 43122743 3 004 43122744 4 004 43122741 8 005 43122745 5 005 43122741 9 006 43122746...

SQL語句查處兩表中,A表中的不再B表中存在的資料

bill price表 資料多 goods name goods standard goods maerial goods factoy city name sale market表 資料多 goods name goods standard goods maerial goods factoy c...

mysql根據表b更新表a的資料

先將excel匯入mysql資料庫,參考 然後執行 update sean t baojia new a,test2018 b set a.supplierid b.id where a.supplier b.comname and a.isdel 0 and a.isyuanliao 原料 注意相...