oracle 取左表不在右表记录的3种方法-引申到db2-开发系列(五)
来源:互联网 发布:淘宝入住条件与费用 编辑:程序博客网 时间:2024/05/18 03:45
引:
我们在做数据库开发用 pl sql 加工数据时,经常会遇到取a表不在b表中的记录 或者 左表不在右表中的记录 的情况,所以特地对此做个简单的总结,以便以后用到回顾。
解决:
取a表某字段不在b表 我们自然的逻辑会想到用 a not in b ,这是第一种方法
1 not in
如下图 ,数据库为不跑业务的测试数据库,两张表的数据量一样, 用not in 可以找出a表中prd_inst_id不在t表中的记录
如下图,为生产库的表 l 和t表数据量相同,数据量900w左右
2 not exsits
1) 如下图,用的 not exists 找出 a表prd_inst_id 不在b表的记录
2)
select ssss1.* from odso.tb_b_ft_broadband_l ssss1 where not exists (select 1 from tb_b_ft_broadband b where ssss1.prd_inst_id = b.prd_inst_id); --2min 30s
3 left join or right join 特别注意 一般不会想到这个
如下图:先用a表 左关联b表 取到a表所有记录的结果集 ,再限制 b.latn_id is null (假设b 本身记录latn_id没有是空的) 实际上应该用b.prd_inst_id is null (关联字段)
即可得到 b表中没有a表prd_inst_id的那些记录,即a表不在b表的记录
上面的所有情况都是a表不在b表的记录占 总记录数据是很少的情况,几百万分之一
从效率上看,测试库的 not in 比 not exsits 在20w及的数据量下 快,差距虽然2倍,但是时间相差不大。
生产库的not exists 比 not in快很多 两分钟,所以关于 not in 及not exists 哪个更快的问题 要看具体情况及执行计划,参考:
oracle开发系列(三)exists¬ exists用法及与in¬ in比较(10g)
再看left join 时间花了 10分钟,比 not in 及exists 满了 好几倍,
但是在db2里面 一般 找数据量大的不存在于 一般都用left join 关联字段为分布键,会很快。
备注:
- oracle 取左表不在右表记录的3种方法-引申到db2-开发系列(五)
- oracle恢复删除的表或表记录的方法
- oracle恢复删除的表或表记录的方法
- oracle恢复删除的表或表记录的方法 .
- oracle恢复删除的表或表记录的方法
- db2 实现oracle wm_concat函数的方法-db2开发系列(一)
- java 插入表记录后得到自增的id (转) (附3种方法代码)
- java 插入表记录后得到自增的id (转) (附3种方法代码)
- oracle表记录恢复
- 表记录的检索
- ORACLE 表记录访问故障
- oracle闪回表记录
- Oracle 回滚表记录
- ORACLE下查看锁表记录的SQL语句
- Oracle 如何找回已经删除了的表记录
- 新建web项目,并连接到Oracle数据库,实现简单的控制台输出数据库中的表记录
- 查询表记录数的效率最高的方法
- 用什么方法删除所有带外键的表记录,
- Jquery确定鼠标进入div的方向
- 图解Android - Binder 和 Service
- 7、oracle vm virtualbox & ubuntu-14.04 应用环境配置方法总结
- 在注册广播的时候就更新一次数据的一种方式:电量计控件BatteryMeterView
- What really happens when you navigate to a URL--网页url跳转过程
- oracle 取左表不在右表记录的3种方法-引申到db2-开发系列(五)
- ping过程详解
- android 动态库死机调试方法
- Java_Ant详解
- IOS输入校验
- 隐藏系统键盘
- 产品经理的情商修炼
- 剑指Offer之 - 树中两个结点的最低公共祖先
- oracle 删除重复数据你想不到的方法大全-开发系列(六)