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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:29:50