Delete Duplicate Records in SQL Server
It’s quite often that we come up with a situation where we have to delete duplicate rows from a table. Duplicate entry may be inserted by mistake or sometimes because of (any) change in a business rule etc.
Below you can have a look at 12 different ways to delete duplicate rows from database tables in different situations. Table values may be uniquely identified with an Identity Column or maybe not. This article will demonstrate both scenarios.
Delete Duplicate Records Example 1
CREATE TABLE DelTable (ID INT, NAME VARCHAR(20), [Address] VARCHAR(50)); INSERT INTO DelTable VALUES(1,'AB','ABCD'), (2,'PQ','PQRS'), (1,'AB','ABCD'), (4,'XY','XYZ'); SELECT * FROM DelTable; SET ROWCOUNT 1 DELETE FROM DelTable WHERE NAME = 'AB' AND Address='ABCD' AND ID=1 SET ROWCOUNT 0 SELECT * FROM DelTable;
Delete Duplicate Records Example 2
CREATE TABLE DelTable1 (ID INT, NAME VARCHAR(20), [Address] VARCHAR(50)); INSERT INTO DelTable1 VALUES(1,'AB','ABCD'), (2,'PQ','PQRS'), (1,'AB','ABCD'), (4,'XY','XYZ'), (1,'AB','ABCD'); SELECT * FROM DelTable1; SET NOCOUNT ON SET ROWCOUNT 1 WHILE 1 = 1 BEGIN DELETE FROM DelTable1 WHERE ID IN(SELECT ID FROM DelTable1 GROUP BY ID HAVING COUNT(*) > 1) IF @@Rowcount = 0 BREAK ; END SET ROWCOUNT 0 SELECT * FROM DelTable1;
Delete Duplicate Records Example 3
CREATE TABLE DelTable2 (ID INT, NAME VARCHAR(20), [Address] VARCHAR(50)); INSERT INTO DelTable2 VALUES(1,'AB','ABCD'), (2,'PQ','PQRS'), (1,'AB','ABCD'), (4,'XY','XYZ'), (1,'AB','ABCD'); SELECT * FROM DelTable2; SELECT * INTO #temporary FROM DelTable2 GROUP BY ID,NAME,Address HAVING COUNT(*) > 1 -- delete all rows that are duplicated DELETE FROM DelTable2 FROM DelTable2 d INNER JOIN #temporary du ON du.ID = d.ID -- insert one row for every duplicate set INSERT INTO DelTable2(ID,NAME,Address) SELECT * FROM #temporary DROP TABLE #temporary SELECT * FROM DelTable2;
Delete Duplicate Records Example 4
CREATE TABLE DelTable3 (ID INT, NAME VARCHAR(20), [Address] VARCHAR(50)); INSERT INTO DelTable3 VALUES(1,'AB','ABCD'), (2,'PQ','PQRS'), (1,'AB','ABCD'), (4,'XY','XYZ'), (1,'AB','ABCD'); SELECT * FROM DelTable3; SELECT DISTINCT * INTO temporaryTable FROM DelTable3 TRUNCATE TABLE DelTable3 DROP TABLE DelTable3 EXEC sp_rename 'temporaryTable', 'DelTable3' SELECT * FROM DelTable3;
Delete Duplicate Records Example 5
CREATE TABLE DelTable4 (Value VARCHAR(20));
INSERT INTO DelTable4 VALUES ('First')
INSERT INTO DelTable4 VALUES ('Second')
INSERT INTO DelTable4 VALUES ('Second')
INSERT INTO DelTable4 VALUES ('Third')
INSERT INTO DelTable4 VALUES ('Third')
SELECT * FROM DelTable4;
DECLARE @value VARCHAR(20),
@previousValue VARCHAR(20),
@noOfRepVal INT
DECLARE cursorValue CURSOR FORWARD_ONLY
FOR SELECT Value FROM DelTable4 ORDER BY Value
FOR UPDATE
OPEN cursorValue
FETCH NEXT FROM cursorValue INTO @value
WHILE @@FETCH_STATUS = 0
BEGIN
IF @previousValue = @value
SELECT @noOfRepVal=COUNT(Value) FROM DelTable4 WHERE Value=@value;
IF(@noOfRepVal >1)
BEGIN
DELETE TOP(@noOfRepVal-1) FROM DelTable4 WHERE Value=@value;
END
SET @previousValue = @value
FETCH NEXT FROM cursorValue INTO @value
END
CLOSE cursorValue
DEALLOCATE cursorValue
SELECT * FROM DelTable4;Delete Duplicate Records Example 6
CREATE TABLE DelTable5 (Value VARCHAR(20));
INSERT INTO DelTable5 VALUES ('First')
INSERT INTO DelTable5 VALUES ('Second')
INSERT INTO DelTable5 VALUES ('Second')
INSERT INTO DelTable5 VALUES ('Third')
INSERT INTO DelTable5 VALUES ('Third')
SELECT * FROM DelTable5;
WITH numbered
AS
(SELECT Value, ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Value ) AS sn
FROM DelTable5)
DELETE FROM numbered
WHERE sn > 1
SELECT * FROM DelTable5;Delete Duplicate Records Example 7
CREATE TABLE DelTable_T (Value VARCHAR(20));
INSERT INTO DelTable_T VALUES ('First')
INSERT INTO DelTable_T VALUES ('Second')
INSERT INTO DelTable_T VALUES ('Second')
INSERT INTO DelTable_T VALUES ('Third')
INSERT INTO DelTable_T VALUES ('Third')
SELECT * FROM DelTable_T
SELECT DISTINCT * INTO NewTable
FROM DelTable_T
DROP TABLE DelTable_T
SELECT * FROM NewTableDelete Duplicate Records Example 8
CREATE TABLE DelTable6 (ID INT, NAME VARCHAR(20), [Address] VARCHAR(50)); INSERT INTO DelTable6 VALUES(1,'AB','ABCD'), (2,'PQ','PQRS'), (3,'AB','ABCD'), (4,'XY','XYZ'), (5,'AB','ABCD'); SELECT * FROM DelTable6; DELETE FROM DelTable6 WHERE ID NOT IN(SELECT MIN(ID)FROM DelTable6 GROUP BY NAME, Address); SELECT * FROM DelTable6;
Delete Duplicate Records Example 9
CREATE TABLE DelTable7 (ID INT IDENTITY(1, 1), Value VARCHAR(20));
INSERT INTO DelTable7 VALUES ('First')
INSERT INTO DelTable7 VALUES ('Second')
INSERT INTO DelTable7 VALUES ('Second')
Select * from DelTable7
WHILE 1 = 1
BEGIN
DELETE FROM DelTable7
WHERE ID IN(SELECT MAX(ID) FROM DelTable7 GROUP BY Value HAVING COUNT(*) > 1)
IF @@ROWCOUNT = 0
BREAK;
END
Select * from DelTable7Delete Duplicate Records Example 10
CREATE TABLE DelTable8 (ID INT IDENTITY(1, 1), Value VARCHAR(20));
INSERT INTO DelTable8 VALUES ('First'),
('Second'),
('Second'),
('Third'),
('Third');
SELECT * FROM DelTable8;
DELETE FROM d
FROM DelTable8 AS d
INNER JOIN DelTable8 AS m
ON m.Value = d.Value AND d.ID < m.ID;
SELECT * FROM DelTable8;
Delete Duplicate Records Example 11
CREATE TABLE DelTable9 (ID INT IDENTITY(1, 1), Value VARCHAR(20));
INSERT INTO DelTable9 VALUES ('First'),
('Second'),
('Second'),
('Third'),
('Third');
SELECT * FROM DelTable9;
DELETE FROM d FROM DelTable9 d
INNER JOIN (SELECT Value FROM DelTable9 GROUP BY Value HAVING COUNT(*) > 1) t
ON d.Value = t.Value
LEFT OUTER JOIN ( SELECT[ID] = MAX(ID) FROM DelTable9 GROUP BY Value HAVING COUNT(*) > 1 ) m
ON d.ID = m.ID
WHERE m.ID IS NULL;
SELECT * FROM DelTable9;Delete Duplicate Records Example 12
CREATE TABLE DelTable10 (ID INT, NAME VARCHAR(20)); INSERT INTO DelTable10 VALUES(1,'AB'),(2,'PQ'),(3,'AB'),(4,'XY'),(5,'AB'); SELECT * FROM DelTable10; DECLARE @totalRecords INT, @rowNumber INT, @value VARCHAR(20), @numberOfRecords INT SELECT @totalRecords=COUNT(ID) FROM DelTable10; SET @rowNumber=1; WHILE @rowNumber < @totalRecords BEGIN SELECT TOP(1) @value=NAME FROM DelTable10 WHERE ID=@rowNumber; SELECT @numberOfRecords=COUNT(ID) FROM DelTable10 WHERE NAME = @value; PRINT @numberOfRecords; IF(@numberOfRecords > 1) BEGIN SET @numberOfRecords =@numberOfRecords - 1; SET ROWCOUNT @numberOfRecords UPDATE DelTable10 SET NAME=NULL WHERE ID = @rowNumber; SET ROWCOUNT 0 END SET @rowNumber = @rowNumber + 1; END DELETE FROM DelTable10 WHERE NAME IS NULL; SELECT * FROM DelTable10;
No comments:
Post a Comment