You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现分组内所有记录均满足条件时才返回查询结果?

解决思路与修正后的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:42:56