選擇不存在於另一表的資料幾種寫法

2021-12-29 23:49:37 字數 2042 閱讀 6230

選擇不存在於另一表的資料幾種寫法

看看以下三種寫法:

寫法1:select ... from a

where a.key not in (select key from b);

寫法2:select ... from a

left join b on a.key = b.key

where b.key is null;

寫法3:select ... from a

where not exists

(select 'x' from b where a.key = b.key);

寫法1採用not in的寫法。很不幸db2對於not in通常採用tbscan(表掃瞄),這是效率很差的寫法。最佳寫法是第三種寫法,如果b.key上有索引,它可以不用fetch b表的資料就可以完成查詢。第二種寫法採用對外表b的 is null判斷進行過濾,效率稍差。

注:事實上,在db2優化器的作用下,第二種寫法與第三種寫法的訪問方案相關無幾,只是第二種寫法比第三種寫法多了一步filter操作。

建議使用第3種寫法,己使用第2種寫法的**也不必修改,因為其效率與第3種寫法差不多。 例:

select a.*

from eds.tw_bcust_200409 a left outer join kf2.tw_bcust b on

a.tm_intrvl_cd =b.tm_intrvl_cd and a.cust_id =b.cust_id and

a.usr_id =b.usr_id and a.bcust_eff_mo =b.bcust_eff_mo

where b.tm_intrvl_cd is null  

select *

from eds.tw_bcust_200409 a

where not exists

(select 'x'

from kf2.tw_bcust b

where a.tm_intrvl_cd =b.tm_intrvl_cd and a.cust_id =b.cust_id

and a.usr_id =b.usr_id and a.bcust_eff_mo =

b.bcust_eff_mo)

這兩種寫法對應的訪問方案:

return                            return     

(   1)                            (   1)     

|                                 |        

btq                               btq       

(   2)                            (   2)     

|                                 |        

filter                            hsjoin     

(   3)                            (   3)     

|                              /      \    

hsjoin                     tbscan       tbscan

(   4)                     (   4)       (   5)

/      \                      |            |  

tbscan       tbscan          table:           table:

(   5)       (   6)          eds              kf2   

|            |             tw_bcust_200409  tw_bcust

table:           table:         

eds              kf2            

tw_bcust_200409  tw_bcust   

找出存在於一張表而又不存在於另外一種表的記錄

表結構 表aid name remark 1 a 58 2 b 52 3 c 23 4 c 44 5 d 24 6 d 45 表bid name 1 a 2 b方法一 查詢語句 select id,name from a except select id,name from b 結果 id name...

ora 00959 表空間不存在 的另一種可能性

建立乙個預設表空間為tp yesj 的使用者a,然後刪除該錶空間,那麼該使用者可以照常登入,如果操作涉及到向該錶空間寫入資料的時候就會出現ora 00959的表空間不存在的錯誤 該使用者可以在它所擁有的許可權下檢視使用者物件以及同義詞 檢視 資料字典等物件 如果此時再建立乙個同名的tp yesj表空...

查詢乙個表中存在而另乙個表中不存在的記錄

例如 兩個表 t1,t2 查詢在表t1中存在,而在表t2中不存在的記錄。假設以id欄位為關聯字段。方法1 需要兩個表的字段完全一致 select from t1 minus selecct from t2 方法2 select from t1 where not exists select 1 fr...