EXISTS 和 IN 的替换使用

本文介绍了在代码改造中,如何遵循新规范,用EXISTS和NOT EXISTS替换IN和NOTIN,解释了它们的适用场景,错误示例的修正,并提供了针对多个条件筛选的正确示例。

使用背景

公司代码改造,在新的开发规范中,不允许使用IN 和 NOT IN,推荐使用EXISTS,介于第一次使用,总结一下自己的理解,以便后面复用。

IN 和 NOT IN

IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况

IN

查询table中number列等于1的数据

SELECT * FRON TABLE WHERE NUMBER IN ('1');

NOT IN

查询table中number列不等于1的数据

SELECT * FRON TABLE WHERE NUMBER NOT IN ('1');

EXISTS 和 NOT EXISTS

EXISTS

查询table中number列等于1的数据

SELECT * FRON TABLE A WHERE 
	EXISTS (SELECT * FROM TABLE B WHERE NUMBER = '1' 
											AND A.ID = B.ID);

解析

当EXISTS的SQL返回的值为真(有结果集)时,保留A表中ID等于B表中ID的行的数据。

NOT EXISTS

查询table中number列不等于1的数据

SELECT * FRON TABLE A WHERE 
	NOT EXISTS (SELECT * FROM TABLE B WHERE NUMBER = '1' 
											AND A.ID = B.ID);

解析

将EXISTS的SQL返回结果取反,取反之后的结果为真(没查询出结果集),则保留A表中ID等于B表中ID的行的数据–(此时最后查询结果为空),取反之后的结果(查询出结果集)为假则不保留–(此时最后查询结果为空)。

使用场景

需要根据某个条件去过滤时都可以使用

未解决问题

不知道怎么根据两个参数去过滤结果,比如查询number = 1 或者number =2 的数据时,结果集为空,相当于 只能in一个值 number in (‘1’),想要number in (‘1’,‘2’)时结果为空,目前不影响业务逻辑,先记录下,后期找到了再解决。

已解决

EXISTS内的条件拼错了,想找不等于 1和2的,用的是OR,把OR换成AND就可以了;

错误示范

SELECT * FRON TABLE A WHERE 
	NOT EXISTS (SELECT * FROM TABLE B 
						WHERE NUMBER != '1' OR NUMBER != '2' 
											AND A.ID = B.ID);

正确示范

SELECT * FRON TABLE A WHERE 
	NOT EXISTS (SELECT * FROM TABLE B 
						WHERE NUMBER  != '1' AND NUMBER != '2' 
											AND A.ID = B.ID);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值