如何从 SQL Server 表中删除重复行
阅读:73
点赞:0
以下是关于从 SQL Server 表中删除重复行的文章优化建议:
一. 介绍
在本文中,我将解释从 SQL Server 表中删除重复行的各种方法。这篇详细的文章将涵盖以下主题。
二. 内容结构
-
介绍 -
从 SQL Server 表中删除重复行的各种方法 -
注意事项 -
结论
三. 创建新数据库
首先,我们将使用 SQL Server 创建一个新数据库。如果您已经有现有数据库,仍然可以执行此步骤。
创建新数据库的 SQL 查询
以下 SQL 查询将创建一个新的数据库和一个表。复制此查询并在查询资源管理器或命令行中执行它。
-- 执行以下查询以创建数据库...
IF (DB_ID('OnkarSharma_DeleteDuplicateRows') IS NOT NULL)
BEGIN
USE master
PRINT '数据库已存在'
DROP DATABASE OnkarSharma_DeleteDuplicateRows
PRINT '数据库已删除...'
END
GO
CREATE DATABASE OnkarSharma_DeleteDuplicateRows
PRINT '新数据库 ''OnkarSharma_DeleteDuplicateRows'' 创建成功'
GO
USE [OnkarSharma_DeleteDuplicateRows]
GO
-- 员工表
CREATE TABLE [dbo].[Employee] (
EmployeeID INT IDENTITY(31100, 1),
EmployerID BIGINT NOT NULL DEFAULT 228866,
FirstName VARCHAR(50) NOT NULL,
LastName VARCHAR(50) NOT NULL,
Email VARCHAR(255) NOT NULL,
DepartmentID VARCHAR(100) NOT NULL,
Age INT NOT NULL,
GrossSalary BIGINT NOT NULL,
PerformanceBonus BIGINT,
ContactNo VARCHAR(25),
PRIMARY KEY (EmployeeID)
);
接下来,您可以使用 SQL INSERT 语句将数据插入表中,或者直接向 SSMS 中的表添加数据。
检查表数据的 SQL 查询
要从“员工”表中获取数据,请使用以下查询。
SELECT * FROM OnkarSharma_DeleteDuplicateRows..Employee
四. 删除表中重复行的三种方法
以下是可用于从 SQL Server 表中删除重复记录的三种常用方法。
方法1:使用 GROUP BY
和 HAVING
子句
在此方法中,SQL GROUP BY
子句用于识别并删除表中的重复行。
语法
DELETE FROM <Table_Name>
WHERE ID NOT IN
(
SELECT MAX(ID) AS MaxRecordID
FROM <Table_Name>
GROUP BY column1, column2, ...
);
例子
DELETE FROM [Employee]
WHERE EmployeeID NOT IN
(
SELECT MAX(EmployeeID) AS MaxRecordID
FROM [Employee]
GROUP BY [EmployerID], [FirstName], [LastName], [Email], [DepartmentID], [Age], [GrossSalary], [PerformanceBonus], [ContactNo]
);
要验证删除,请使用以下查询:
SELECT * FROM OnkarSharma_DeleteDuplicateRows..Employee
方法2:使用 CTE(通用表表达式)
CTE(通用表表达式)也可用于从 SQL Server 中的表中删除重复的行。
语法
WITH CTE AS (
SELECT
column1,
column2,
...
ROW_NUMBER() OVER (
PARTITION BY column1, column2, ...
ORDER BY column1, column2, ...
) AS RowNumber
FROM
<Table_Name>
)
DELETE FROM CTE
WHERE RowNumber > 1;
例子
WITH CTE AS
(
SELECT
[EmployeeID],
[EmployerID],
[FirstName],
[LastName],
[Email],
[DepartmentID],
[Age],
[GrossSalary],
[PerformanceBonus],
[ContactNo],
ROW_NUMBER() OVER (
PARTITION BY [EmployerID], [FirstName], [LastName], [Email], [DepartmentID], [Age], [GrossSalary], [PerformanceBonus], [ContactNo]
ORDER BY [EmployeeID]
) AS RowNumber
FROM
Employee
)
DELETE FROM CTE
WHERE RowNumber > 1;
要验证删除,请使用以下查询:
SELECT * FROM OnkarSharma_DeleteDuplicateRows..Employee
方法3:使用 RANK
函数
带有 PARTITION BY
的 RANK
函数也可用于从 SQL Server 中的表中删除重复的行。
语法
DELETE E
FROM <Table_Name> E
INNER JOIN
(
SELECT *,
RANK() OVER(PARTITION BY column1, column2, ...
ORDER BY ID) rank
FROM <Table_Name>
) T ON E.ID = T.ID
WHERE rank > 1;
例子
DELETE E
FROM [Employee] E
INNER JOIN
(
SELECT *,
RANK() OVER (
PARTITION BY [EmployerID], [FirstName], [LastName], [Email], [DepartmentID], [Age], [GrossSalary], [PerformanceBonus], [ContactNo]
ORDER BY [EmployeeID]
) AS rank
FROM [Employee]
) T ON E.[EmployeeID] = T.[EmployeeID]
WHERE rank > 1;
要验证删除,请使用以下查询:
SELECT *
FROM OnkarSharma_DeleteDuplicateRows..Employee;
五. 注意事项
在删除任何类型的记录之前,我建议您遵循以下几点:
-
备份您的数据。 -
请务必使用 SELECT
语句测试您的DELETE
查询。 -
根据需求选择一种有效的方法来删除重复的行。
六. 结论
在本文中,我们探讨了在 SQL Server 中删除重复行的多种方法。无论您选择哪种方法,确保在执行删除操作之前备份数据并进行充分测试,以确保数据的完整性和准确性。