Oracle SQL查询需求:筛选所有approvalIN为N的studyNo
Oracle SQL 查询所有approvalIN均为'N'的studyNo
以下是几种高效的查询实现方式:
方法1:GROUP BY + HAVING 结合聚合函数
利用字符排序特性('Y'的ASCII码大于'N'),通过MAX()函数判断该studyNo下是否存在'Y':
SELECT studyNo FROM studypart GROUP BY studyNo HAVING MAX(approvalIN) = 'N';
如果某个studyNo下存在至少一条approvalIN = 'Y'的记录,MAX(approvalIN)结果会是'Y',这样的记录会被HAVING条件过滤掉,最终只保留全为'N'的studyNo。
方法2:NOT EXISTS 子查询
通过子查询排除存在'Y'的studyNo:
SELECT DISTINCT sp.studyNo FROM studypart sp WHERE NOT EXISTS ( SELECT 1 FROM studypart sp2 WHERE sp2.studyNo = sp.studyNo AND sp2.approvalIN = 'Y' );
NOT EXISTS会检查当前studyNo是否没有任何approvalIN = 'Y'的记录,满足条件的studyNo会被保留,DISTINCT用于去重(因为一个studyNo对应多条studypart记录)。
方法3:MINUS 集合运算
通过集合差集得到目标结果:
SELECT studyNo FROM studypart MINUS SELECT studyNo FROM studypart WHERE approvalIN = 'Y';
MINUS返回第一个查询结果中不存在于第二个查询的记录,也就是从所有studyNo中排除掉那些存在'Y'的编号,剩下的就是全为'N'的studyNo。
关联study表的场景(可选)
如果需要确保返回的studyNo在study表中存在,可以添加JOIN:
SELECT s.stdyno FROM study s JOIN studypart sp ON s.stdyno = sp.studyNo GROUP BY s.stdyno HAVING MAX(sp.approvalIN) = 'N';
内容的提问来源于stack exchange,提问作者vignesh waran
相关产品推荐
相关产品推荐

