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

如何通过SELECT语句查询数据表中的非重复数据?

解决表中重复行的去重查询问题

嘿,我来帮你搞定这个去重查询的需求!从你给出的数据表和期望结果来看,你需要提取出所有整行唯一的记录,下面给你几种可行的正确方案:

方法1:使用DISTINCT关键字(最直接)

DISTINCT的作用是对SELECT后面所有列的组合进行去重,不需要给列加括号,直接把所有需要保留的列列出来就行:

SELECT DISTINCT id, lang1, sth, sth2 FROM tbl;

这个语句会自动过滤掉所有完全重复的行,返回你想要的唯一结果集。

方法2:使用GROUP BY(适合需要聚合操作的场景)

如果你的数据库开启了严格模式(比如MySQL的ONLY_FULL_GROUP_BY),之前的写法只GROUP BY id, lang1会报错,因为sth和sth2既不在GROUP BY里,也没有用聚合函数处理。

方案A:分组所有列(和DISTINCT效果一致)

把所有列都加入GROUP BY子句,这样就能得到唯一的行组合:

SELECT id, lang1, sth, sth2 FROM tbl GROUP BY id, lang1, sth, sth2;

方案B:聚合非分组列(适合同一分组下其他列值固定的情况)

从你的示例数据来看,相同id和lang1对应的sth、sth2都是一样的,这时候可以用聚合函数(比如MAX()、MIN())来提取这些列的值,分组只需要id和lang1,效率更高:

SELECT id, lang1, MAX(sth) AS sth, MAX(sth2) AS sth2 FROM tbl GROUP BY id, lang1;

这个写法的前提是:同一id+lang1分组下,sth和sth2的值是完全相同的,这样用聚合函数取到的就是正确的值。

纠正你之前的写法问题

  • SELECT DISTINCT(id, lang1), sth, sth2 FROM tbl:DISTINCT后面的括号会把(id, lang1)当成一个整体元组去重,但sth和sth2不会参与去重,可能导致返回的行和你期望的不一致,而且这种写法在很多数据库里是不合法的。
  • SELECT id, lang1, sth, sth2 FROM tbl GROUP BY id, lang1:在严格SQL模式下,非分组列sth、sth2没有被聚合,数据库无法确定返回哪一行的对应值,所以会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:46:37