一、问题
我有两张表,客户表和合同表;客户表是稳定的,不常变化的,基本没有时间限制;而合同表示不稳定的,有过期时间的;如果时间过期,则合同表作废,使用逻辑删除,将其失效;这时候,我有一个需求,就是获取客户表中,没有签合同的客户信息;
二、分析
首先,我们要知道,求两张表是否有交,并,差,一定要使用至少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的时候,不要加表示结束的分号;
欢迎关注我的公众号:【幕桥社区】