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 );
逻辑拆解:
- 子查询
t2:还是先筛选出符合条件的val2(对应至少两种不同val1); - 主查询通过
INNER JOIN拿到原表中这些val2的所有记录; - 最后的
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
相关产品推荐
相关产品推荐

