MS Access/DBeaver单表查询:去除同一DocumentNo下重复Description行
解决MS Access/DBeaver中同一DocumentNo下排除重复Description行的问题
嘿,我来帮你搞定这个筛选重复行的问题!你之前写的SQL逻辑确实出问题了——你让同一行的DocumentNo不等于它自己、Description也不等于它自己,这显然永远不会成立,所以返回空结果是必然的。
下面给你几种实用的解决方案,不管是MS Access还是DBeaver都能用:
方法1:用DISTINCT快速获取唯一组合
如果只需要保留DocumentNo和Description的唯一组合(其他字段可以接受任意匹配的行),这是最简洁的写法:
SELECT DISTINCT DocumentNo, Description, [其他需要的字段名] FROM Table1;
比如你要排除第5行(SSPT284895 Tubing),只要之前已经有相同的DocumentNo+Description组合,这个语句就会自动去重,只保留其中一行。
方法2:用子查询+聚合函数保留完整行
如果需要保留完整的行数据,且你的表有主键(比如ID),可以通过聚合函数(MIN()或MAX())锁定每个重复组合里的某一行(比如ID最小的那行):
SELECT t1.* FROM Table1 t1 INNER JOIN ( -- 先分组找到每个DocumentNo+Description的最小ID SELECT DocumentNo, Description, MIN(ID) AS MinID FROM Table1 GROUP BY DocumentNo, Description ) t2 ON t1.ID = t2.MinID;
这个方法会精准保留每个重复组合里的第一行(ID最小的),其他重复行都会被排除,完全符合你的需求。
方法3:用NOT EXISTS排除重复行
这也是一种常用的去重思路,逻辑是:只保留每个DocumentNo+Description组合中ID最小的那一行,所有ID更大的重复行都会被过滤掉:
SELECT * FROM Table1 t1 WHERE NOT EXISTS ( SELECT 1 FROM Table1 t2 WHERE t2.DocumentNo = t1.DocumentNo AND t2.Description = t1.Description AND t2.ID < t1.ID );
这个写法在MS Access和DBeaver里都能完美运行,而且逻辑清晰,容易理解。
注意事项
- 如果你的字段名包含空格或特殊字符,记得用方括号
[]括起来(比如[Document No]); - 如果没有主键字段,也可以用其他唯一标识字段(比如创建时间
CreateDate)来替代ID,选择最早或最晚的行保留。
内容的提问来源于stack exchange,提问作者bohzwah
相关产品推荐
相关产品推荐

