SQL进阶-exists函数

博客探讨了在SQL查询中使用EXISTS和NOT EXISTS子查询时遇到的问题及其解决方法。当子查询没有与主查询进行有效约束时,可能会导致不期望的结果。文章提供了一个修正后的查询示例,强调在WHERE子句中加入与主表的约束条件以确保正确性。此外,还展示了如何使用CASE语句在子查询中进行条件判断。

exists函数使用问题

exists 和not exists使用过程中,出现exists为A表的全部值(not exists 出现的是空值)
举例如下:

SELECT a1.*
FROM a a1
WHERE not EXISTS -- 不存在满足以下条件的行
(SELECT 1
FROM a a2
WHERE  a2.gmv >100000000)

查询出来的是a表的全部值
问题出现在可能有2个方面:
A表中存在空值行—该项情况,本次查询中不存在
A表和子查询没有做连接约束–注意,唯一值
修正后的:使用唯一值约束:

SELECT a1.*
FROM a a1
WHERE not EXISTS -- 不存在满足以下条件的行
(SELECT 1
FROM a a2
WHERE a1.year_month= a2.year_month 
and 1= case when a2.gmv >100000000 then 1 else 0 end)

注意:如果约束的并非是唯一值,会出现数据错误的情况
结论:
exists 子查询
子查询的过程中注意在where限制条件中加入与A表的约束条件
参考sql 进阶中的1.8中

select uid
from testscores ts1
where subject in('maths','chinese')
and exists(select * from testscores ts2
where ts2.uid = ts1.uid
and 1= (case when subject ='maths' and scores>80 then 1
when subject ='chinese' and scores>50 then 1
else 0 end))
group by 1
having count(*) =2
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值