Удаление дубликатов из таблицы в SQL Server

В этом руководстве вы узнаете, как удалить дубликаты строк из таблицы в SQL Server.

Чтобы удалить дубликаты строк из таблицы в SQL Server, выполните следующие действия:

  • Найдите повторяющиеся строки с помощью предложения GROUP BY или функции ROW_NUMBER().
  • Используйте оператор DELETE для удаления дубликатов строк.

Давайте создадим пример таблицы для демонстрации.

Создание таблицы образцов

Сначала создайте новую таблицу с именем sales.contacts следующим образом:

DROP TABLE IF EXISTS sales.contacts;
CREATE TABLE sales.contacts(
    contact_id INT IDENTITY(1,1) PRIMARY KEY,
    first_name NVARCHAR(100) NOT NULL,
    last_name NVARCHAR(100) NOT NULL,
    email NVARCHAR(255) NOT NULL,
);

Во-вторых, вставьте несколько строк в таблицу sales.contacts:

INSERT INTO sales.contacts
   (first_name,last_name,email) 
VALUES
   ('Syed','Abbas',' [email protected] '),
   ('Catherine','Abel',' [email protected] '),
   ('Kim','Abercrombie',' [email protected] '),
   ('Kim','Abercrombie',' [email protected] '),
   ('Kim','Abercrombie',' [email protected] '),
   ('Hazem','Abolrous',' [email protected] '),
   ('Hazem','Abolrous',' [email protected] '),
   ('Humberto','Acevedo',' [email protected] '),
   ('Humberto','Acevedo',' [email protected] '),
   ('Pilar','Ackerman',' [email protected] ');

В-третьих, запросите данные из таблицы sales.contacts:

SELECT 
   contact_id, 
   first_name, 
   last_name, 
   email
FROM 
   sales.contacts;

На следующем рисунке показан результат запроса:

SQL Server удаляет дубликаты

Имеется много повторяющихся строк(3,4,5),(6,7) и(8,9) для контактов с одинаковыми именем, фамилией и адресом электронной почты.

Пример удаления дубликатов строк из таблицы

Следующий оператор использует общее табличное выражение( CTE ) для удаления дубликатов строк:

WITH cte AS(
    SELECT 
        contact_id, 
        first_name, 
        last_name, 
        email, 
        ROW_NUMBER() OVER(
            PARTITION BY 
                first_name, 
                last_name, 
                email
            ORDER BY 
                first_name, 
                last_name, 
                email
        ) row_num
     FROM 
        sales.contacts
)
DELETE FROM cte
WHERE row_num > 1;

В этом заявлении:

  • Во-первых, CTE использует функцию ROW_NUMBER() для поиска дубликатов строк, указанных значениями в столбцах first_name, last_name и email.
  • Затем оператор DELETE удаляет все дублирующиеся строки, но сохраняет только одно вхождение каждой дублирующей группы.

SQL Server выдал следующее сообщение, указывающее, что дубликаты строк были удалены.

(4 rows affected)

Если вы снова запросите данные из таблицы sales.contacts, вы обнаружите, что все дублирующиеся строки удалены.

SELECT contact_id, 
       first_name, 
       last_name, 
       email
FROM sales.contacts
ORDER BY first_name, 
         last_name, 
         email;

Результат удаления дубликатов строк SQL Server

В этом уроке вы узнали, как удалять дубликаты строк из таблицы в SQL Server.

Мирослав С.

Автор статей, ИБ-специалист