oracle 取左表不在右表記錄的3種方法-引申到db2-開發系列(五)

引:

我們在做數據庫開發用 pl sql 加工數據時,經常會遇到取a表不在b表中的記錄 或者 左表不在右表中的記錄 的情況,所以特地對此做個簡單的總結,以便以後用到回顧。


解決:

取a表某字段不在b表 我們自然的邏輯會想到用 a not in b ,這是第一種方法


1 not in 


如下圖 ,數據庫爲不跑業務的測試數據庫,兩張表的數據量一樣, 用not in 可以找出a表中prd_inst_id不在t表中的記錄 



如下圖,爲生產庫的表  l 和t表數據量相同,數據量900w左右




2 not exsits 


1) 如下圖,用的 not exists 找出 a表prd_inst_id 不在b表的記錄 



2)

select ssss1.*
  from odso.tb_b_ft_broadband_l ssss1
 where not exists (select 1
          from tb_b_ft_broadband b
         where ssss1.prd_inst_id = b.prd_inst_id); --2min 30s


3 left join or right join  特別注意 一般不會想到這個


如下圖:先用a表 左關聯b表 取到a表所有記錄的結果集 ,再限制 b.latn_id is null (假設b 本身記錄latn_id沒有是空的) 實際上應該用b.prd_inst_id is null (關聯字段)

即可得到 b表中沒有a表prd_inst_id的那些記錄,即a表不在b表的記錄




上面的所有情況都是a表不在b表的記錄佔 總記錄數據是很少的情況,幾百萬分之一

從效率上看,測試庫的 not in 比 not exsits 在20w及的數據量下 快,差距雖然2倍,但是時間相差不大。

生產庫的not exists 比 not in快很多 兩分鐘,所以關於 not in 及not exists 哪個更快的問題 要看具體情況及執行計劃,參考:

oracle開發系列(三)exists¬ exists用法及與in¬ in比較(10g)


再看left join 時間花了 10分鐘,比 not in 及exists 滿了 好幾倍,

但是在db2裏面 一般 找數據量大的不存在於 一般都用left join 關聯字段爲分佈鍵,會很快。


備註:

第3種 left join ,有時候面試的時候或許會問到。 防止緊張 想不起來



發佈了51 篇原創文章 · 獲贊 99 · 訪問量 54萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章