MySQL 两张表取差集
MySQL 差集、left join
·
业务场景如下:
人员表中有证件号、手机号字段,这两个字段因为涉及到个人隐私问题,因此加密存储,有另外一张解密表可以和人员表进行关联,查出解密后的证件号和手机号,现在需要统计出人员表中有多少没有加密的数据,进行再次加密处理,这个时候,考虑到的就是求两张表的差集,来找出未加密的人员。
- 求差集 SQL 脚本
select p.* from persons p
left join CERT_CNO_PNO_TAB c ON c.PERSON_BUSINESS_ID = p.id
where p.`status` = 'person.status.allow.yes' and p.del_flag = '0'
and c.id is null;
注意看,where 语句的最后一个条件。通过 left join 连表之后,再使用右表的 c.id is null 来进行过滤,最终可以得到 person 表与 CERT_CNO_PNO_TAB 表中的差集。
结果如下:
我们来验证一下,看看求得的这个差集,在解密表中是否真的不存在。
select * from CERT_CNO_PNO_TAB where PERSON_BUSINESS_ID = '0f551c3e03e34e449e5b2e31b64efdc5';
结果如下:
可以看出,通过 left join 再加上 右表的条件过滤取的的差集,是正确的。
这种求差集的效率,远比 not in 、not exist 要快的多,小伙伴们可以尝试一下!
更多推荐
已为社区贡献5条内容
所有评论(0)