选择不存在于另一表的数据几种写法
2013-07-06 13:23
363 查看
看看以下三种写法:
写法1:SELECT ... FROM AWHERE 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
相关文章推荐
- Java中迭代列表中数据时几种循环写法的效率比较
- datagrid数据导出到excel文件给客户端下载的几种方法 选择自 yangyifan0 的 Blog
- mysql 选择插入数据(包含不存在列)具体实现
- angularJs中缓存数据,免去重复发起请求的几种写法
- C#格式化数据的几种写法
- mysql 选择插入数据(包含不存在列)具体实现
- sql选择插入多行数据到同一表中的几种方法汇总
- JAVA中迭代列表中数据时的几种循环写法
- 几种基本数据类型选择
- Java中迭代列表中数据时几种循环写法的效率比较
- 数据工厂模式,多种数据库选择 web.config 写法及相关操作
- 将A 表数据插入B表而B表不存在 Oracle 写法
- 整理最近新学到的几种sql写法(一)动态“循环”更新表内数据
- 取第一条数据的几种写法
- 分享SQL语句从M条数据读取到N条的几种写法!
- Java中迭代列表中数据时几种循环写法的效率比较
- [置顶] C/C++编程题开头字符串、数据输入几种写法
- mysql 选择插入数据(包含不存在列)
- 【 D3.js 选择集与数据详解 — 4 】 enter和exit的处理方法以及处理模板
- 白话经典算法系列之四 直接选择排序及交换二个数据的正确实现