oracle从左取非零的数据,oracle 取左表不在右表记录的三种方法-引申到db2-开发系列(五)...

oracle 取左表不在右表记录的3种方法-引申到db2-开发系列(五)

引:

我们在做数据库开发用 pl sql 加工数据时,经常会遇到取a表不在b表中的记录 或者 左表不在右表中的记录 的情况,所以特地对此做个简单的总结,以便以后用到回顾。

解决:

取a表某字段不在b表 我们自然的逻辑会想到用 a not in b ,这是第一种方法

1 not in

如下图 ,数据库为不跑业务的测试数据库,两张表的数据量一样, 用not in 可以找出a表中prd_inst_id不在t表中的记录

084815356.png

如下图,为生产库的表  l 和t表数据量相同,数据量900w左右

084815357.jpg

2 not exsits

1) 如下图,用的 not exists 找出 a表prd_inst_id 不在b表的记录

084815358.png

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

3left 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表的记录

084815359.png

上面的所有情况都是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 关联字段为分布键,会很快。

备注:

第3种 left join ,有时候面试的时候或许会问到。 防止紧张 想不起来

版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值