oracle数据库中怎样删除一个表的重复数据。

这条SQL你已经写得很清楚了。
我们先看一下查询语句。
这里使用了 ROW_NUMBER() 函数。
该函数按 ID 和名称进行分组,然后在内部按 ID 和名称进行排序,为每条记录赋予一个序列号 RN。
PARTITION BY id, name 是什么意思?这意味着具有相同 ID 和名称的记录将保留在一组中。
例如,将所有id=1 、name='张三'的记录分为一个组,然后在该组中按ID和名称排序。
第一个重复的 rn=1 ,后续重复的 rn=2 ,依此类推。
最后,WHERE rn>1 选择不重复的记录,因为只有重复的记录才会被分到同一组,然后rn大于1
看delete语句,有点复杂。
我们先看一下内部查询。
与查询语句一样,使用ROW_NUMBER()对记录进行排序,然后WHERE rn>1 选择重复记录。
然后外层查询从这堆重复记录中选择RN。
最后,DELETE TableA WHERE ROWNUM=(...)就是删除rn与外查询选择的rn对应的记录。
说白了,就是先找到所有重复的记录,按照这个序号排序,然后删除。

说实话,这个删除语句有点复杂。
事实上,可以使用更简单的方法。
例如,使用临时表首先选择重复的ID和名称,然后将它们加入到原始表中,最后将其删除。
这不容易吗?但你这样写可以,你只需要理解为什么要这样写。
当时我不明白为什么这么复杂,但是读了更多之后,我意识到有时为了满足特定的要求,你必须这样写。

PS:你使用ROWNUM还是ROW_NUMBER()?这两者是不同的。
ROWNUM从1 开始,无论分组如何,都是全局类型; ROW_NUMBER() 是组内排序,从 1 开始。
您可以使用 ROW_NUMBER() 进行查询和删除,这不是问题。

sql 查询中删除重复数据,只保留一条数据怎样写

嗯,我记得上次我帮助同事填写客户表格时,由于重复的电子邮件地址而大惊小怪。
他的桌子不是很大,只有三千多行,但他有几个大客户,他们的电子邮件地址和号码重复了数百次。
直接使用Different是没有用的。
经过多次检查后,您将无法使用它。

正当他挠头的时候,他突然想起以前见过的ROW_NUMBER的用法。
让他们找到一个可以先尝试的测试环境。
我在键盘上快速输入:
sql 创建表 temp_customers AS SELECT , ROW_NUMBER() OVER(按电子邮件分区,按 ID 排序)AS rn 来自客户;
他说:看,这个 rn 是行号。
对于相同的邮件,ID较小的将排在第一位,行号为1 对于重复的邮箱,行号必须大于1
他问下一步是什么。
他们告诉我删除它。
SQL 从 ID 为 ( 从 temp_customers 中选择 ID,其中 rn > 1 ); 删除表 temp_customers;
他眼睛一亮,连忙也跟着跑了。
进度条会慢几分钟,估计有3 000多行,处理重复项需要一些时间。
跑完后,我兴奋地查看了一下,发现每个邮箱里都只剩下一个邮箱了,而且都是最小的ID。
他一直夸我,说我很棒。

但我心里知道,这个方法并不是万能的。
他的数据库是MySQL。
如果您要切换到 Oracle 或 SQL Server,则可能需要进行更改,例如使用 DENSE_RANK 或 RANK,或者仅使用通用表表达式 (CTE)。
另外,ORDER BY中的字段必须存在于表中,不能随意创建。
如果您的表非常大(数百万或数千万),那么在上线之前肯定需要备份。
上次删除了桌子上的几项后,当他发现一个重要客户的记录不见了时,他惊呆了,几乎喘不过气来。

等一下。
我刚刚看到临时表中除了 rn 之外的所有字段都被选中。
是不是有点浪费呢?如果你的表有太多字段,SELECT 会非常慢。
请务必仅选择必填字段,例如电子邮件和电话。
但见他着急,也没有跟他多说什么。

有时小技巧可以解决大问题。
但是在使用数据库时你必须非常小心,不能粗心大意。
需要特别注意ID的排列方式以及是否进行了备份。
否则,如果删除出错,“3 0年的辛苦也许有一天会回到解放前的样子”。
如果他从客户列表中删除了错误的项目,他可能会损失几百美元或更多。
他可能失去了一个大客户。
想想都觉得可怕。

当我想到这一点时,我实际上可以看到哪些电子邮件地址在他的表中重复次数最多。
有 3 ,000 多行和数百个重复项。
肯定有一些东西占用了很多空间。
使用 GROUP BY 和 COUNT 查找前几个并真正删除所有重复项。
确认您要删除它。
你可以考虑留下其中一位或者联系他核实一下。
有时数据清理并不适合所有目的。

掌握 SQL DISTINCT:删除重复项变得简单

是的,就是这样,独特。
这个东西就像一个筛子,过滤掉重复的东西。
写法很简单:SELECT DISTINCT 列名 FROM 表名。
单列? 就一行一行的筛选吧,比如员工部门。
多列? 一起过滤多个条件,例如订单中的重复客户和产品。

使用此方法可以查看不同的数据并准确地找到差异。
但要小心,效率低下,会慢慢杀死一个大表。
条件复杂吗? 您必须依靠其他方法,例如 GROUP BY 或 ROW_NUMBER()。

所以,谨慎使用DISTINCT,不要浪费资源。

数据库去重的几种方法

上周,我朋友的公司遇到了数据库中有重复数据的问题。
他们用了三种方法来解决,感觉效果不错。

2 02 3 年,他们首先使用了rowid方法,该方法在Oracle数据库中特别有用。
例如,如果他们想在两个表中查找同名的数据,他们会编写一条SQL语句: Select from table1 aWhere rowid != (select max(rowid) from table2 bWhere a.name1 = b.name1 And a.name2 = b.name2 ...)
然后,他们也使用这种方法删除重复数据:Delete from table1 aWhere rowid != (select max(rowid) From table2 bWhere a.name1 = b.name1 And a.name2 = b.name2 .....)
接下来,他们使用groupby方法,该方法通常与count、max等聚合函数结合使用。
他们检查了一个student表,例如:Select count(num), max(name) from Student Group by num,这样就可以找到num列中的重复记录。

最后,他们还使用distinct方法来处理小表,可以过滤掉重复记录。
例如,他们想要在学生表中找到唯一的名称:选择来自学生的不同名称
这取决于您。
这三种方法各有其优点。
使用哪一种取决于实际情况。
没关系。