如何从 SQL Server 表中删除重复行

发布:2024-10-12 16:16 阅读:73 点赞:0

以下是关于从 SQL Server 表中删除重复行的文章优化建议:

一. 介绍

在本文中,我将解释从 SQL Server 表中删除重复行的各种方法。这篇详细的文章将涵盖以下主题。

二. 内容结构

  1. 介绍
  2. 从 SQL Server 表中删除重复行的各种方法
  3. 注意事项
  4. 结论

三. 创建新数据库

首先,我们将使用 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(311001),
    EmployerID BIGINT NOT NULL DEFAULT 228866,
    FirstName VARCHAR(50NOT NULL,
    LastName VARCHAR(50NOT NULL,
    Email VARCHAR(255NOT NULL,
    DepartmentID VARCHAR(100NOT 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 BYHAVING 子句

在此方法中,SQL GROUP BY 子句用于识别并删除表中的重复行。

语法

DELETE FROM <Table_Name>
WHERE ID NOT IN
(
    SELECT MAX(IDAS 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 BYRANK 函数也可用于从 SQL Server 中的表中删除重复的行。

语法

DELETE E
FROM <Table_Name> E
INNER JOIN
(
    SELECT *,
           RANK() OVER(PARTITION BY column1, column2, ...
           ORDER BY IDrank
    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 中删除重复行的多种方法。无论您选择哪种方法,确保在执行删除操作之前备份数据并进行充分测试,以确保数据的完整性和准确性。