MS Access中筛选记录数>2且排除OPTION为NO的SQL查询问题
修正MS Access SQL查询:筛选符合条件的记录
需求明确
需从Absen与MASTERID表中查询满足以下要求的记录:
- 同一
ID、同一DATE对应的记录数大于2 - 排除该
ID下存在OPTION='NO'的所有记录
现有代码问题分析
你当前的SQL存在3个关键错误:
GROUP BY子句用AND分隔字段不符合MS Access语法,正确写法是用逗号分隔- 子查询未处理
OPTION='NO'的排除逻辑,导致可能纳入不符合要求的ID分组 - 子查询关联逻辑混乱,未准确限定
ID和DATE的分组范围
修正后的SQL代码
SELECT a.ID, m.NAMEID, a.DATE, a.TIME, a.INOUT FROM ABSEN AS a INNER JOIN MASTERID AS m ON a.ID = m.ID WHERE -- 过滤当前记录自身OPTION不为空的情况(可根据实际需求调整) a.OPTION IS NULL -- 验证当前ID+DATE分组的记录数大于2 AND EXISTS ( SELECT 1 FROM ABSEN AS a2 WHERE a2.ID = a.ID AND a2.DATE = a.DATE GROUP BY a2.ID, a2.DATE HAVING COUNT(*) > 2 ) -- 确保该ID下没有任何OPTION='NO'的记录 AND NOT EXISTS ( SELECT 1 FROM ABSEN AS a3 WHERE a3.ID = a.ID AND a3.OPTION = 'NO' ) ORDER BY a.ID, a.DATE, a.INOUT;
代码逻辑说明
- 第一个
EXISTS子句:精准校验当前ID和DATE对应的分组记录数是否超过2 - 第二个
NOT EXISTS子句:彻底排除所有存在OPTION='NO'记录的ID,符合需求中的排除规则 - 主查询的
a.OPTION IS NULL:过滤单条记录自身的异常值,若需求允许该字段为其他非NO值,可删除此条件
可选调整版本(针对分组内无NO的场景)
如果你的需求是仅排除同一ID+DATE分组内存在NO的记录,而非整个ID的所有记录,可使用以下代码:
SELECT a.ID, m.NAMEID, a.DATE, a.TIME, a.INOUT FROM ABSEN AS a INNER JOIN MASTERID AS m ON a.ID = m.ID WHERE EXISTS ( SELECT 1 FROM ABSEN AS a2 WHERE a2.ID = a.ID AND a2.DATE = a.DATE GROUP BY a2.ID, a2.DATE -- 同时满足记录数>2、分组内无NO记录两个条件 HAVING COUNT(*) > 2 AND SUM(IIF(a2.OPTION = 'NO', 1, 0)) = 0 ) ORDER BY a.ID, a.DATE, a.INOUT;
内容的提问来源于stack exchange,提问作者dlaksmi
相关产品推荐
相关产品推荐

