選擇不存在於另一表的資料幾種寫法
看看以下三種寫法:
寫法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...