【Oracle】如何获取两个表的差集

一、问题

我有两张表,客户表和合同表;客户表是稳定的,不常变化的,基本没有时间限制;而合同表示不稳定的,有过期时间的;如果时间过期,则合同表作废,使用逻辑删除,将其失效;这时候,我有一个需求,就是获取客户表中,没有签合同的客户信息;

二、分析

首先,我们要知道,求两张表是否有交,并,差,一定要使用至少1个关键字段来关联,否则,两张表何谈关联;其次,因为客户表非常庞大,合同表也非常庞大,如果用Oracle的in查询,因为若超过1000条,肯定会报错的,所以该方案基本可以放弃。
所以我们换一种方式,就是使用Oracle中的MINUS关键字;MINUS表示求差集,并且使用客户号来关联;即A表有,但是B表没有客户号的记录,放到我这个问题,就是客户表有的客户号,但是合同表没有的客户号;值得注意的是,要将数据量交大的表放前面,数据量较小的放后面;

三、解决

1、基本语法

select * from Table1  where ...
MINUS
select * from Table2 where ...

2、这里,我们只是获取了Table1中有的,但是Table2中没有的合同号,距离我们获取Table1中有的,但是Table2中没有的合同信息还差一步;我们可以使用结果集和左连接查询来解决:

select * from Table1 t
left join (
    select * from Table1  where ...
    MINUS
    select * from Table2 where ...
) mm on mm.cont_no =  t.cont_no

3、在上文where后面省略号后面加上你需要的限制条件即可;

4、PS:在Mybatis标签里面写SQL的时候,不要加表示结束的分号;

欢迎关注我的公众号:【幕桥社区】
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陶洲川

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值