Delete duplicates with a CTE (common table expression).
This script uses the same setup as the anonymous post using a cursor (http://www.sqlservercentral.com/scripts/viewscript.asp?scriptid=1872).
2002-03-27
2,856 reads
Delete duplicates with a CTE (common table expression).
This script uses the same setup as the anonymous post using a cursor (http://www.sqlservercentral.com/scripts/viewscript.asp?scriptid=1872).
---------------
-- setup duplicates to remove
---------------
IF EXISTS (SELECT * FROM DBO.SYSOBJECTS WHERE ID = OBJECT_ID(N'[TableWithDuplicates]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
DROP TABLE [TableWithDuplicates]
GO
CREATE TABLE TableWithDuplicates (
KeyColumn VARCHAR(100) PRIMARY KEY NOT NULL,
Column1 VARCHAR(100),
Column2 VARCHAR(100)
);
INSERT INTO TableWithDuplicates(KeyColumn, Column1, Column2)
VALUES ('A','Duplicate2','Duplicate3');
INSERT INTO TableWithDuplicates(KeyColumn, Column1, Column2) -- Duplicate row
VALUES ('B','Duplicate2','Duplicate3');
INSERT INTO TableWithDuplicates(KeyColumn, Column1, Column2) -- Duplicate row
VALUES ('C','Duplicate2','Duplicate3');
INSERT INTO TableWithDuplicates(KeyColumn, Column1, Column2)
VALUES ('D','DuplicateY','DuplicateZ');
INSERT INTO TableWithDuplicates(KeyColumn, Column1, Column2) -- Duplicate row
VALUES ('E','DuplicateY','DuplicateZ');
INSERT INTO TableWithDuplicates(KeyColumn, Column1, Column2) -- Duplicate row
VALUES ('F','DuplicateY','DuplicateZ');
INSERT INTO TableWithDuplicates(KeyColumn, Column1, Column2) -- Duplicate row
VALUES ('G','DuplicateY','DuplicateZ');
INSERT INTO TableWithDuplicates(KeyColumn, Column1, Column2) -- Duplicate row
VALUES ('H','DuplicateY','DuplicateZ');
---------------
-- before
---------------
SELECT * FROM TableWithDuplicates;
---------------
-- run test
---------------
DECLARE @KeyColumn VARCHAR(100)
, @Column1 VARCHAR(100)
, @Column2 VARCHAR(100)
, @PreviousColumn1 VARCHAR(100)
, @PreviousColumn2 VARCHAR(100) ;
with d_cte as(
SELECT
KeyColumn,
COALESCE(Column1,'') AS Column1,
COALESCE(Column2,'') AS Column2, row_number() over(partition by column1, column2 order by keycolumn, column1, column2) as row_id
FROM TableWithDuplicates
)
delete from d_cte where row_id >1;
---------------
-- after
---------------
SELECT * FROM TableWithDuplicates