SQL:去重的几种常用方法(oracle)

DISTINCT是最简单、最容易理解的。
直接把重量去掉就可以了。
但仅限于指定字段。

GROUP BY 非常灵活。
可以使用聚合函数。
很多学校都重用这个。

爬取窗口功能。
重用这个很复杂。
你可以控制安排和一切。

IN+ROWID 查看唯一键。
如果唯一键不重复,请使用此选项。

NOTEXISTS 逻辑清晰。
子查询识别重复项。
适合复杂的逻辑。

JOIN+GROUPBY 删除表之间的重复项。
将其用于多表关联。

如何选择?这取决于您想要关注的场景。

sql 中 distinct 用法_sql 中 distinct 去重技巧

独特...说实话...它只是一个重复的删除工具。

复制单个列是最简单的。
例如,查看用户表中的城市;有多少个城市去重:
sql 从用户中选择特定城市;
这意味着什么?检查所有用户和城市列。
不要再这样做了。
我会为你列一个清单。
北京 上海 广州...就是这样!城市名称只出现一次。

注意。

从多列组合中删除重复项有点棘手。
例如,如果您检查用户名和年龄不同:
sql 用户的唯一名称;选择年龄
这意味着什么?检查所有用户,合并他们的姓名和年龄,不要重复。
比如,张三2 5 岁;李四3 0了。
张三2 5 只会出现一次。
就算再有一个张三二十五,也只会给你一个殊荣。

但是要小心,参与的时候要小心。
示例:
sql 独特的你的名字; JOIN u 用户的订单 o.order_date o ON u.id = o.user_id;
这意味着什么?这是将订单表与用户链接起来以检查姓名和订单日期。
如果用户有多个订单;每个用户和订单日期都将合并在结果中。
例如,如果张三有3 个订单,则张三2 02 3 -01 -01 ;张三 2 02 3 -01 -02 , 张三 2 02 3 -01 -03 将有三行。
DISTINCT 只会从这些组合中删除重复项;由于用户不会删除重复项,因此张三只会出现一次。
该日期将重复。

将其与批处理函数一起使用也很常见。
例如,检查有多少个城市不同:
sql 从用户中选择 COUNT(不同城市);
这意味着什么?用户表;检查城市栏和不同城市的数量。
例如北京上海广州只有3 个,返回COUNT(DISTINCT city)。

注意:不要忘记添加 DISTINCT。
如果你忘记了:
sql 从用户中选择 COUNT(城市);
这很愚蠢。
他们只是统计城市中的非空值,无论是否是同一个城市。
例如,如果您在北京有 1 个,在上海有 1 个。
结果将为 2
也可以使用 SUM 和 AVG。
例如,查询不同工资的总和:
sql 从用户中选择总和(差异工资);
您还可以一起使用 GROUP BY。
但GROUP BY之后不能有未分组的字段;请注意,否则DISTINCT将不会生效。

性能优化也很重要。
当数据量较大时,DISTINCT需要排序和去重。
例如,您可以使用
sql 而不是 GROUP BY。
--选项 选择城市 COUNT()按用户所在城市进行分组。

这意味着什么?按城市对他们进行分组,并计算每组中有多少人。
由于一个城市只能分配到一组,按城市分组就显得过重了。

JOIN后不要盲目使用DISTINCT。
比如很多关系;一个用户有多个角色:
sql 不同的 u.name,从用户中选择 r.role_name u JOIN user_roles ur ON u.id = ur.user_id JOIN 角色 r ON ur.role_id = r.id;
这可能是个问题。
如果一个用户有多个角色;每个用户和角色将合并在结果中。
如果只想删除重复用户,则必须首先考虑GROUP BY用户和JOIN等其他方法。

总结:

从单个列中删除重复项;选择已识别的列。

多列对于确保逻辑对一致并不重要;小心使用 JOIN 来扩展行数。

聚合函数使用COUNT(DISTINCT列)。

如果性能较差,请考虑使用GROUP BY或优化数据模型。

业务需求必须明确;不要忽视你应该删除的东西。
不要随意删除不该删除的内容。