Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Nhiều cách để xóa bản sao khỏi bảng SQL

Tổng quan

Bài viết này thảo luận về hai cách tiếp cận khác nhau có sẵn để loại bỏ các hàng trùng lặp khỏi (các) bảng SQL, điều này thường trở nên khó khăn theo thời gian khi dữ liệu phát triển nếu việc này không được thực hiện đúng thời hạn.

Sự hiện diện của các hàng trùng lặp là một vấn đề phổ biến mà các nhà phát triển và kiểm tra SQL phải đối mặt theo thời gian, tuy nhiên, các hàng trùng lặp này thuộc một số danh mục khác nhau mà chúng ta sẽ thảo luận trong bài viết này.

Bài viết này tập trung vào một tình huống cụ thể, khi dữ liệu được chèn vào bảng cơ sở dữ liệu, dẫn đến việc giới thiệu các bản ghi trùng lặp và sau đó chúng ta sẽ xem xét kỹ hơn các phương pháp để loại bỏ các bản sao và cuối cùng là loại bỏ các bản sao bằng các phương pháp này.

Chuẩn bị dữ liệu mẫu

Trước khi chúng tôi bắt đầu khám phá các tùy chọn khác nhau có sẵn để loại bỏ các bản sao, tại thời điểm này, việc thiết lập một cơ sở dữ liệu mẫu sẽ giúp chúng tôi hiểu các tình huống khi dữ liệu trùng lặp xâm nhập vào hệ thống và các phương pháp được sử dụng để loại bỏ nó .

Thiết lập cơ sở dữ liệu mẫu (UniversityV2)

Bắt đầu bằng cách tạo cơ sở dữ liệu rất đơn giản chỉ bao gồm Sinh viên ở đầu.

-- (1) Create UniversityV2 sample database
CREATE DATABASE UniversityV2;
GO

USE UniversityV2

CREATE TABLE [dbo].[Student] (
    [StudentId] INT           IDENTITY (1, 1) NOT NULL,
    [Name]      VARCHAR (30)  NULL,
    [Course]    VARCHAR (30)  NULL,
    [Marks]     INT           NULL,
    [ExamDate]  DATETIME2 (7) NULL,
    CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED ([StudentId] ASC)
);

Điền bảng sinh viên

Hãy để chúng tôi chỉ thêm hai bản ghi vào bảng Sinh viên:

-- Adding two records to the Student table
SET IDENTITY_INSERT [dbo].[Student] ON
INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (1, N'Asif', N'Database Management System', 80, N'2016-01-01 00:00:00')
INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (2, N'Peter', N'Database Management System', 85, N'2016-01-01 00:00:00')
SET IDENTITY_INSERT [dbo].[Student] OFF

Kiểm tra dữ liệu

Xem bảng có chứa hai bản ghi khác nhau vào lúc này:

-- View Student table data
SELECT [StudentId]
      ,[Name]
      ,[Course]
      ,[Marks]
      ,[ExamDate]
  FROM [UniversityV2].[dbo].[Student]

Bạn đã chuẩn bị thành công dữ liệu mẫu bằng cách thiết lập cơ sở dữ liệu với một bảng và hai bản ghi riêng biệt (khác nhau).

Bây giờ chúng ta sẽ thảo luận về một số tình huống tiềm năng trong đó các bản sao được giới thiệu và xóa bắt đầu từ các tình huống đơn giản đến hơi phức tạp.

Trường hợp 01:Thêm và xóa các bản sao

Bây giờ chúng ta sẽ giới thiệu (các) hàng trùng lặp trong bảng Sinh viên.

Điều kiện tiên quyết

Trong trường hợp này, một bảng được cho là có các bản ghi trùng lặp nếu Tên của học sinh , Khóa học , Dấu hiệu Ngày thi trùng khớp trong nhiều bản ghi ngay cả khi ID sinh viên khác.

Vì vậy, chúng tôi giả định rằng không có hai sinh viên nào có thể trùng tên, khóa học, điểm và ngày thi.

Thêm dữ liệu trùng lặp cho Student Asif

Hãy để chúng tôi cố tình chèn một bản ghi trùng lặp cho Sinh viên:Asif cho Sinh viên bảng như sau:

-- Adding Student Asif duplicate record to the Student table
SET IDENTITY_INSERT [dbo].[Student] ON
INSERT INTO [dbo].[Student] ([StudentId], [Name], [Course], [Marks], [ExamDate]) VALUES (3, N'Asif', N'Database Management System', 80, N'2016-01-01 00:00:00')
SET IDENTITY_INSERT [dbo].[Student] OFF	

Xem dữ liệu sinh viên trùng lặp

Xem Sinh viên bảng để xem các bản ghi trùng lặp:

-- View Student table data
SELECT [StudentId]
      ,[Name]
      ,[Course]
      ,[Marks]
      ,[ExamDate]
  FROM [UniversityV2].[dbo].[Student]

Tìm bản sao bằng phương pháp tự tham chiếu

Điều gì sẽ xảy ra nếu có hàng nghìn bản ghi trong bảng này, thì việc xem bảng sẽ không giúp ích được nhiều.

Trong phương pháp tự tham chiếu, chúng tôi lấy hai tham chiếu đến cùng một bảng và kết hợp chúng bằng cách sử dụng ánh xạ từng cột với ngoại lệ ID được tạo nhỏ hơn hoặc lớn hơn ID khác.

Hãy để chúng tôi xem xét phương pháp tự tham chiếu để tìm các bản sao giống như sau:

USE UniversityV2

-- Self-Referencing method to finding duplicate students having same name, course, marks, exam date
SELECT S1.[StudentId] as S1_StudentId,S2.StudentId as S2_StudentID
	,S1.Name AS S1_Name, S2.Name as S2_Name
	,S1.Course AS S1_Course, S2.Course as S2_Course
	,S1.ExamDate as S1_ExamDate, S2.ExamDate AS S2_ExamDate
  FROM [dbo].[Student] S1,[dbo].[Student] S2
  WHERE S1.StudentId<S2.StudentId AND
  S1.Name=S2.Name
  AND 
  S1.Course=S2.Course
  AND
  S1.Marks=S2.Marks
  AND
  S1.ExamDate=S2.ExamDate

Đầu ra của tập lệnh trên chỉ hiển thị cho chúng ta các bản ghi trùng lặp:

Tìm bản sao bằng Phương pháp tự tham chiếu-2

Một cách khác để tìm các bản sao bằng cách sử dụng tự tham chiếu là sử dụng INNER JOIN như sau:

-- Self-Referencing method 2 to find duplicate students having same name, course, marks, exam date
SELECT S1.[StudentId] as S1_StudentId,S2.StudentId as S2_StudentID
	,S1.Name AS S1_Name, S2.Name as S2_Name
	,S1.Course AS S1_Course, S2.Course as S2_Course
	,S1.ExamDate as S1_ExamDate, S2.ExamDate AS S2_ExamDate
  FROM [dbo].[Student] S1
  INNER JOIN
  [dbo].[Student] S2
  
  ON S1.Name=S2.Name
  AND 
  S1.Course=S2.Course
  AND
  S1.Marks=S2.Marks
  AND
  S1.ExamDate=S2.ExamDate
  WHERE S1.StudentId<S2.StudentId

Xóa bản sao bằng phương pháp tự tham chiếu

Chúng tôi có thể xóa các bản sao bằng cùng một phương pháp mà chúng tôi đã sử dụng để tìm các bản sao ngoại trừ việc sử dụng DELETE theo cú pháp của nó như sau:

USE UniversityV2

-- Removing duplicates by using Self-Referencing method
DELETE S2
  FROM [dbo].[Student] S1,
  [dbo].[Student] S2
WHERE S1.StudentId < S2.StudentId
  AND S1.Name = S2.Name
  AND S1.Course = S2.Course
  AND S1.Marks = S2.Marks
  AND S1.ExamDate = S2.ExamDate

Kiểm tra dữ liệu sau khi loại bỏ trùng lặp

Hãy để chúng tôi nhanh chóng kiểm tra hồ sơ sau khi chúng tôi đã loại bỏ các bản sao:

USE UniversityV2

-- View Student data after duplicates have been removed
SELECT
  [StudentId]
 ,[Name]
 ,[Course]
 ,[Marks]
 ,[ExamDate]
FROM [UniversityV2].[dbo].[Student]

Tạo Quy trình Lưu trữ Bản sao Xem và Loại bỏ Bản sao

Bây giờ chúng ta biết rằng các tập lệnh của mình có thể tìm và xóa thành công các hàng trùng lặp trong SQL, tốt hơn nên chuyển chúng thành dạng xem và thủ tục được lưu trữ để dễ sử dụng:

USE UniversityV2;
GO

-- Creating view find duplicate students having same name, course, marks, exam date using Self-Referencing method
CREATE VIEW dbo.Duplicates

AS

SELECT
  S1.[StudentId] AS S1_StudentId
 ,S2.StudentId AS S2_StudentID
 ,S1.Name AS S1_Name
 ,S2.Name AS S2_Name
 ,S1.Course AS S1_Course
 ,S2.Course AS S2_Course
 ,S1.ExamDate AS S1_ExamDate
 ,S2.ExamDate AS S2_ExamDate
FROM [dbo].[Student] S1
    ,[dbo].[Student] S2
WHERE S1.StudentId < S2.StudentId
AND S1.Name = S2.Name
AND S1.Course = S2.Course
AND S1.Marks = S2.Marks
AND S1.ExamDate = S2.ExamDate

GO

-- Creating stored procedure to removing duplicates by using Self-Referencing method
CREATE PROCEDURE UspRemoveDuplicates
AS
BEGIN
  DELETE S2
    FROM [dbo].[Student] S1,
    [dbo].[Student] S2
  WHERE S1.StudentId < S2.StudentId
    AND S1.Name = S2.Name
    AND S1.Course = S2.Course
    AND S1.Marks = S2.Marks
    AND S1.ExamDate = S2.ExamDate
END

Thêm và xem nhiều bản ghi trùng lặp

Bây giờ, hãy để chúng tôi thêm bốn bản ghi nữa vào Sinh viên bảng và tất cả các bản ghi là bản sao theo cách chúng có cùng tên, khóa học, điểm và ngày thi:

--Adding multiple duplicates to Student table
INSERT INTO Student (Name,
Course,
Marks,
ExamDate)
  VALUES ('Peter', 'Database Management System', 85, '2016-01-01'),
  ('Peter', 'Database Management System', 85, '2016-01-01'),
  ('Peter', 'Database Management System', 85, '2016-01-01'),
  ('Peter', 'Database Management System', 85, '2016-01-01');

-- Viewing Student table after multiple records have been added to Student table
SELECT
  [StudentId]
 ,[Name]
 ,[Course]
 ,[Marks]
 ,[ExamDate]
FROM [UniversityV2].[dbo].[Student]

Xóa các bản sao bằng cách sử dụng thủ tục UspRemoveDuplicates

USE UniversityV2

-- Removing multiple duplicates
EXEC UspRemoveDuplicates

Kiểm tra dữ liệu sau khi loại bỏ nhiều bản sao

USE UniversityV2

--View Student table after multiple duplicates removal
SELECT
  [StudentId]
 ,[Name]
 ,[Course]
 ,[Marks]
 ,[ExamDate]
FROM [UniversityV2].[dbo].[Student]

Trường hợp 02:Thêm và xóa các bản sao có cùng ID

Cho đến nay, chúng tôi đã xác định được các bản ghi trùng lặp có các ID riêng biệt nhưng nếu các ID giống nhau thì sao.

Ví dụ:hãy nghĩ đến tình huống trong đó một bảng đã được nhập gần đây từ tệp văn bản hoặc tệp Excel không có khóa chính.

Điều kiện tiên quyết

Trong trường hợp này, một bảng được cho là có các bản ghi trùng lặp nếu tất cả các giá trị cột hoàn toàn giống nhau, bao gồm một số cột ID và khóa chính bị thiếu, điều này làm cho việc nhập các bản ghi trùng lặp trở nên dễ dàng hơn.

Tạo bảng khóa học không có khóa chính

Để tạo lại tình huống trong đó các bản ghi trùng lặp trong trường hợp không có khóa chính rơi vào bảng, trước tiên chúng ta hãy tạo một Khóa học mới bảng không có bất kỳ khóa chính nào trong cơ sở dữ liệu University2 như sau :

USE UniversityV2

-- Creating Course table without primary key
CREATE TABLE [dbo].[Course] (
    [CourseId] INT           NOT NULL,
    [Name]     VARCHAR (30)  NOT NULL,
    [Detail]   VARCHAR (200) NULL,   
);

Điền bảng khóa học

-- Populating Course table
INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (1, N'T-SQL Programming', N'About T-SQL Programming')
INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (2, N'Tabular Data Modeling', N'This is about Tabular Data Modeling')
INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail]) VALUES (3, N'Analysis Services Fundamentals', N'This is about Analysis Services Fundamentals')

Kiểm tra dữ liệu

Xem Khóa học bảng:

USE UniversityV2

-- Viewing Course table
SELECT CourseId
      ,Name
      ,Detail FROM dbo.Course

Thêm dữ liệu trùng lặp trong bảng khóa học

Bây giờ, hãy chèn các bản sao vào Khóa học bảng:

USE UniversityV2

-- Inserting duplicate records in Course table
INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail])
  VALUES (1, N'T-SQL Programming', N'About T-SQL Programming')
INSERT INTO [dbo].[Course] ([CourseId], [Name], [Detail])
  VALUES (1, N'T-SQL Programming', N'About T-SQL Programming')

Xem dữ liệu khóa học trùng lặp

Chọn tất cả các cột để xem bảng:

USE UniversityV2

-- Viewing duplicate data in Course table
SELECT CourseId
      ,Name
      ,Detail FROM dbo.Course

Tìm bản sao bằng phương pháp tổng hợp

Chúng tôi có thể tìm các bản sao chính xác bằng cách sử dụng phương pháp tổng hợp bằng cách nhóm tất cả các cột với tổng số nhiều hơn một sau khi chọn tất cả các cột cùng với việc đếm tất cả các hàng bằng hàm đếm tổng hợp (*):

-- Finding duplicates using Aggregate method
SELECT <column1>,<column2>,<column3>…
  ,COUNT(*) AS Total_Records
FROM <Table>
GROUP BY <column1>,<column2>,<column3>…
HAVING COUNT(*)>1

Điều này có thể được áp dụng như sau:

USE UniversityV2

-- Finding duplicates using Aggregate method
SELECT
  c.CourseId
 ,c.Name
 ,c.Detail
 ,COUNT(*) AS Duplicate_Records
FROM dbo.Course c
GROUP BY c.CourseId
        ,c.Name
        ,c.Detail
HAVING COUNT(*) > 1

Loại bỏ các bản sao bằng phương pháp tổng hợp

Hãy để chúng tôi loại bỏ các bản sao bằng Phương pháp Tổng hợp như sau:

USE UniversityV2

-- Removing duplicates using Aggregate method

-- (1) Finding duplicates and put them into a new table (CourseNew) as a single row
SELECT
  c.CourseId
 ,c.Name
 ,c.Detail
 ,COUNT(*) AS Duplicate_Records INTO CourseNew
FROM dbo.Course c

GROUP BY c.CourseId
        ,c.Name
        ,c.Detail
HAVING COUNT(*) > 1

-- (2) Rename Course (which contains duplicates) as Course_OLD 
EXEC sys.sp_rename @objname = N'Course'
                  ,@newname = N'Course_OLD'


-- (3) Rename CourseNew (which contains no duplicates) as Course 
EXEC sys.sp_rename @objname = N'CourseNew'
                  ,@newname = N'Course'

-- (4) Insert original distinct records into Course table from Course_OLD table
INSERT INTO Course (CourseId, Name, Detail)
  SELECT
    co.CourseId
   ,co.Name
   ,co.Detail
  FROM Course_OLD co
  WHERE co.CourseId <> (SELECT
      c.CourseId
    FROM Course c)
  ORDER BY CO.CourseId

-- (4) Data check
SELECT
  cn.CourseId
 ,cn.Name
 ,cn.Detail
FROM Course cn
                                      
-- Clean up 
-- (5) You can drop the Course_OLD table afterwards
-- (6) You can remove Duplicate_Records column from Course table afterwards

Kiểm tra dữ liệu

SỬ DỤNG UniversityV2

Vì vậy, chúng tôi đã học thành công cách xóa các bản sao khỏi bảng cơ sở dữ liệu bằng hai phương pháp khác nhau dựa trên hai trường hợp khác nhau.

Việc cần làm

Giờ đây, bạn có thể dễ dàng xác định và loại bỏ bảng cơ sở dữ liệu khỏi giá trị trùng lặp.

1. Thử tạo UspRemoveDuplicatesByAggregate thủ tục được lưu trữ dựa trên phương pháp được đề cập ở trên và loại bỏ các bản sao bằng cách gọi thủ tục đã lưu trữ

2. Hãy thử sửa đổi quy trình được lưu trữ được tạo ở trên (UspRemoveDuplicatesByAggregates) và triển khai các mẹo Dọn dẹp được đề cập trong bài viết này.

  DROP TABLE CourseNew
-- (5) You can drop the Course_OLD table afterwards
-- (6) You can remove Duplicate_Records column from Course table afterwards

3. Bạn có thể chắc chắn rằng UspRemoveDuplicatesByAggregate Thủ tục được lưu trữ có thể được thực thi nhiều lần nhất có thể, ngay cả sau khi loại bỏ các bản sao, để cho thấy rằng thủ tục vẫn nhất quán ngay từ đầu?

4. Vui lòng tham khảo bài viết trước của tôi Bước tới Bắt đầu Phát triển Cơ sở dữ liệu Theo hướng Thử nghiệm (TDDD) - Phần 1 và thử chèn các bản sao vào bảng cơ sở dữ liệu SQLDevBlog, sau đó thử xóa các bản sao bằng cả hai phương pháp được đề cập trong mẹo này.

5. Vui lòng thử tạo một cơ sở dữ liệu mẫu khác Nhân viênSample tham khảo bài viết trước của tôi Nghệ thuật tách biệt phụ thuộc và dữ liệu trong kiểm tra đơn vị cơ sở dữ liệu và chèn các bản sao vào bảng và thử xóa chúng bằng cả hai phương pháp bạn đã học được từ mẹo này.

Công cụ hữu ích:

dbForge Data Compare dành cho SQL Server - công cụ so sánh SQL mạnh mẽ có khả năng làm việc với dữ liệu lớn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Phân tích dữ liệu QuickBooks trong Dundas BI

  2. Thiếu chỉ mục trong MS SQL hoặc Tối ưu hóa nhanh chóng

  3. So sánh Hiệu suất Windows Azure VM, Phần 1

  4. Thống kê chờ Knee-Jerk:CXPACKET

  5. Kết nối Delphi với Salesforce.com