大家好,如果您想知道如何删除 SQL 中的重复行并在 SQL Server、MySQL 和 Oracle 等不同数据库上寻找解决方案,那么您来对地方了。在本文中,我将分享两种从 SQL 中删除重复行的方法,第一种是使用 GROUP BY 和 HAVING 子句,第二种是使用适用于大多数数据库的 RANK 函数。您可以使用任何方法通过 SQL 从表中删除重复项。这也是流行的SQL 面试问题之一,所以知道如何解决这个问题也会让你在面试中占据优势。
为什么需要删除重复行?
在开发 SQL Server 对象时,我们应该遵循特定的最佳实践。为保持数据完整性和性能,表应包括主键、标识列、聚簇和非聚簇索引以及约束。
即使我们遵循最佳实践,我们也可能会遇到诸如重复行之类的问题。我们也可能在数据导入期间在临时表中获取这些数据,并且我们希望在将它们插入生产表之前消除重复条目。
假设您的 SQL 数据库中有重复的行并且您想要删除它们。我们必须定期应对这些挑战。但是,如果我们在数据库中已经有重复的行,建议的做法是利用相关的键和约束来消除重复行的风险。
要清除重复数据,我们必须使用某些程序。本文讨论了从 SQL 表中删除重复数据的方法。
设置数据
在我们解决这个问题之前,我们需要一些示例数据来帮助我们将其可视化。让我们用一些数据制作一个员工表。
将使用以下查询。
CREATE TABLE Employee (id int(50) primary key, name varchar(80), salary int(50));
复制
现在,向该表中插入一些数据。我已经插入了一些数据如下。已经包含了一些令人兴奋的著名名字:p 希望你们喜欢板球!我们使用的是查找第 N 个最高薪水文章时使用的同一张表。但是,我们将添加一些重复项。更新后的表看起来像这样:
可以看到,很明显我们有重复的记录,因为ID是主键,通常有自增的业务逻辑,这里可以忽略。
SQL DELETE 使用 GROUP BY 和 HAVING 子句
SQL GROUP BY 子句用于此方法中以查找重复条目。COUNT 函数可用于使用 Group By 子句检查行的出现,该子句根据提供的列组织数据。
例如,如果我们运行以下查询,我们将获得 Employee 数据库中发生率大于 1 的所有记录。
SELECT name, salary, COUNT(*) AS CNT FROM Employee GROUP BY name, salary HAVING COUNT(*) > 1;
复制
以下查询的结果如下所示:
我们只需要保留一行并删除重复项。只需要删除表中的重复行。例如,Emp Virat 和 Chahal 在表中出现了两次。我们只是想摆脱它的一个实例。
为了计算每个数据行的最大 id,我们使用 SQL MAX 函数。
SELECT * FROM Employee WHERE id NOT IN ( SELECT MAX(id) FROM Employee GROUP BY name, salary );
复制
上述查询的结果如下所示:
我们可以看到上面的 Select 行省略了每个重复行的最大 ID 值,只留下最小 ID 值。
将第一个 Select 替换为 SQL delete 语句,如以下查询所示,以消除此数据。
DELETE FROM Employee WHERE id NOT IN ( SELECT MAX(id) FROM Employee GROUP BY name, salary );
复制
执行delete语句后对Employee表进行select,得到如下表项,没有重复行。
SQL DELETE 使用 RANK 函数
我们还可以利用 SQL RANK 函数来去除重复的行。无论重复行如何,SQL RANK 函数都会为每一行返回一个唯一的行 ID。
PARTITION BY 子句在以下查询中与 RANK 函数一起使用。PARTITION BY 子句将数据划分为提供的列的子集,并为每个分区分配评级。
DELETE E FROM Employee E JOIN ( SELECT *, RANK() OVER(PARTITION BY name, salary ORDER BY id) rank FROM Employee ) T ON E.ID = T.ID;
复制
我们将得到的结果与上一个类似。所有重复项都将被删除。如您所见,该方法比前一个方法稍微复杂一些,但提供了一种更好的方法来对列进行排名和检查。您可以将 DELETE 关键字替换为 SELECT 并通过选择适当的列,您将能够看到列的排名和输出。
总结
在这篇文章中,我们研究了如何使用各种方法(包括 SQL 函数)删除 SQL 中的重复行。您可以自由使用任何让您感到最自在的方式。但是,我建议不要立即在生产数据上实施这些技术和打包。您应该在要求较低的环境中进行测试。
原文标题:2 Ways to remove duplicate rows in SQL? Example Tutorial
原文链接:https://www.sqlrevisited.com/2022/03/2-ways-to-remove-duplicate-rows-in-sql.html