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

MS Access/SQL查询:仅当val1不同时筛选val2重复的记录

嗨,针对你在MS Access里的这个筛选需求,先帮你把需求掰扯清楚:咱们要找的是那些val2字段重复出现,但同一个val2对应的val1值不全相同的记录;像val2只出现一次的(比如你例子里的res1、res2),还有完全重复的条目(比如4和5,val1和val2都一模一样的),都要排除在外。

下面给你两种贴合需求的实现方案:

方案1:返回去重后的(val1, val2)组合

如果你不需要记录的id,只想拿到符合条件的唯一val1和val2组合,可以用这条SQL:

SELECT DISTINCT val1, val2
FROM [your_table_name]
WHERE val2 IN (
    SELECT val2
    FROM [your_table_name]
    GROUP BY val2
    HAVING COUNT(DISTINCT val1) > 1
);

逻辑拆解:

  • 内层子查询先找出所有对应至少两种不同val1的val2值,把val2唯一的情况先排除;
  • 外层查询从原表中筛选出属于这些val2的记录,再用DISTINCT去掉完全重复的(val1, val2)条目。

方案2:返回带id的记录(自动排除完全重复项)

如果你需要保留记录的id,同时去掉像4和5这种完全重复的条目,可以用这条SQL:

SELECT t1.*
FROM [your_table_name] t1
INNER JOIN (
    SELECT val2
    FROM [your_table_name]
    GROUP BY val2
    HAVING COUNT(DISTINCT val1) > 1
) t2 ON t1.val2 = t2.val2
WHERE NOT EXISTS (
    SELECT 1
    FROM [your_table_name] t3
    WHERE t3.val1 = t1.val1
      AND t3.val2 = t1.val2
      AND t3.id < t1.id
);

逻辑拆解:

  1. 子查询t2:还是先筛选出符合条件的val2(对应至少两种不同val1);
  2. 主查询通过INNER JOIN拿到原表中这些val2的所有记录;
  3. 最后的NOT EXISTS子句:确保每个(val1, val2)组合只保留id最小的那条,自动过滤掉后续重复的记录。

兼容老版本Access的替代写法

如果你的Access版本不支持COUNT(DISTINCT)语法,可以把内层的筛选子查询替换成下面的写法:

SELECT val2
FROM [your_table_name]
GROUP BY val2
HAVING (
    SELECT COUNT(*) 
    FROM (SELECT DISTINCT val1 FROM [your_table_name] t WHERE t.val2 = [your_table_name].val2)
) > 1

这个写法通过嵌套子查询来统计每个val2对应的不同val1数量,效果和COUNT(DISTINCT)完全一致,适配更老的Access版本。

内容的提问来源于stack exchange,提问作者Massi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:10:28