当前位置:操作系统 > Unix/Linux >>

选择不存在于另一表的数据几种写法

选择不存在于另一表的数据几种写法
 
看看以下三种写法:
写法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   
 
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,