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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:26:54