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