MS Access多条件返回非唯一行SQL查询需求
解决方法:筛选FIELD D重复且对应FIELD I多值的记录
没问题,针对你这个需求,我们可以通过两步筛选来实现——先定位FIELD D重复的记录,再从中过滤出同一FIELD D下FIELD I有多个不同值的条目。下面给你两种常用的实现方式:
方法1:窗口函数(推荐,简洁高效)
适合PostgreSQL、MySQL 8+、SQL Server等支持窗口函数的现代数据库:
SELECT t.* FROM ( SELECT *, -- 统计当前FIELD D的总出现次数 COUNT(*) OVER (PARTITION BY FIELD_D) AS d_count, -- 统计当前FIELD D下不同FIELD I的数量 COUNT(DISTINCT FIELD_I) OVER (PARTITION BY FIELD_D) AS i_distinct_count FROM MASTER ) t WHERE t.d_count > 1 -- 筛选FIELD D出现多次的记录 AND t.i_distinct_count > 1; -- 进一步筛选同一FIELD D下FIELD I有多个不同值的记录
逻辑说明:
- 内层子查询通过
PARTITION BY FIELD_D对数据按FIELD D分组,用窗口函数分别计算每个分组的总记录数和不同FIELD I的数量 - 外层通过
WHERE条件同时满足两个筛选要求,直接返回符合条件的原始完整记录
方法2:子查询+JOIN(兼容老版本数据库)
如果你的数据库不支持窗口函数(比如MySQL 5.x),可以用这种方式:
SELECT m.* FROM MASTER m -- 关联到FIELD D重复的分组 JOIN ( SELECT FIELD_D FROM MASTER GROUP BY FIELD_D HAVING COUNT(*) > 1 -- 筛选出现多次的FIELD D ) d_duplicates ON m.FIELD_D = d_duplicates.FIELD_D -- 关联到FIELD D下FIELD I多值的分组 JOIN ( SELECT FIELD_D FROM MASTER GROUP BY FIELD_D HAVING COUNT(DISTINCT FIELD_I) > 1 -- 筛选对应FIELD I有多个不同值的FIELD D ) i_multiple ON m.FIELD_D = i_multiple.FIELD_D;
逻辑说明:
- 第一个子查询
d_duplicates先找出所有重复的FIELD D - 第二个子查询
i_multiple找出所有对应FIELD I有多个不同值的FIELD D - 通过两次JOIN,只保留同时满足两个条件的原始记录
特殊场景兼容(比如老版本Oracle)
如果你的数据库不支持窗口函数里的COUNT(DISTINCT),可以用DENSE_RANK的技巧替代:
SELECT t.* FROM ( SELECT *, COUNT(*) OVER (PARTITION BY FIELD_D) AS d_count, -- 通过正序+倒序排名计算不同FIELD I的数量 DENSE_RANK() OVER (PARTITION BY FIELD_D ORDER BY FIELD_I) + DENSE_RANK() OVER (PARTITION BY FIELD_D ORDER BY FIELD_I DESC) - 1 AS i_distinct_count FROM MASTER ) t WHERE t.d_count > 1 AND t.i_distinct_count > 1;
内容的提问来源于stack exchange,提问作者greatshogon
相关产品推荐
相关产品推荐

