如何实现分组内所有记录均满足条件时才返回查询结果?
解决思路与修正后的SQL代码
首先,咱们得抓准问题核心:你需要的是整个PLANNO分组里的所有记录都满足MOD(PLAN.qty, ITEM.BOX)=0,而不是只要分组里有一条符合条件就行。原来的SQL之所以达不到要求,是因为WHERE子句先把不符合条件的记录过滤掉了,分组后只要这个PLANNO还有剩余记录(哪怕仅一条)就会被返回,完全没考虑分组里是不是原本存在不符合条件的记录。
下面给你两种可行的解决方案:
方法一:通过COUNT对比验证全组合规
这种思路是先关联两张表,对每个PLANNO分组后,统计总记录数和符合条件的记录数。当两者相等时,就说明该分组的所有记录都满足要求:
SELECT p.PLANNO, COUNT(p.PLANNO) AS TOTAL_ORDER FROM PLAN p JOIN ITEM i ON p.TYPE = i.TYPE GROUP BY p.PLANNO HAVING COUNT(*) = COUNT(CASE WHEN MOD(p.qty, i.BOX) = 0 THEN 1 END) ORDER BY p.PLANNO;
简单解释:
COUNT(*)统计的是当前PLANNO分组关联后的总记录数COUNT(CASE WHEN MOD(p.qty, i.BOX)=0 THEN 1 END)仅统计符合条件的记录(不符合的会返回NULL,COUNT不会统计NULL值)- 两者相等就意味着分组内没有不符合条件的记录
方法二:用NOT EXISTS排除存在违规记录的分组
这种思路是先找出所有存在至少一条不符合条件记录的PLANNO,再把这些分组排除,剩下的就是全组合规的PLANNO:
SELECT p.PLANNO, COUNT(p.PLANNO) AS TOTAL_ORDER FROM PLAN p JOIN ITEM i ON p.TYPE = i.TYPE WHERE NOT EXISTS ( SELECT 1 FROM PLAN p2 JOIN ITEM i2 ON p2.TYPE = i2.TYPE WHERE p2.PLANNO = p.PLANNO AND MOD(p2.qty, i2.BOX) != 0 ) GROUP BY p.PLANNO ORDER BY p.PLANNO;
简单解释:
- 子查询会定位出所有存在违规记录的PLANNO
- 外层的
NOT EXISTS会把这些有问题的PLANNO全部排除,最终只保留全组都合规的分组
用你的示例数据测试效果
针对你给出的测试数据:
PLAN表的A001分组中,TYPE B的QTY是201,ITEM表B的BOX是200,MOD(201,200)=1≠0,所以这个分组会被正确排除,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Shirokuma1205
相关产品推荐
相关产品推荐

