Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Изтриване на дублиращи се редове в SQL Server

Следният пример използва T-SQL за изтриване на дублиращи се редове в SQL Server.

За да бъдем по-конкретни, той изтрива дублиращи се редове, но запазва един. Така че, ако имате два еднакви реда, той изтрива единия от тях и запазва другия. С други думи, това премахва измамата на масата.

Примерни данни

Да предположим, че имаме таблица със следните данни:

SELECT * FROM Pets;

Резултат:

+---------+-----------+-----------+
| PetId   | PetName   | PetType   |
|---------+-----------+-----------|
| 1       | Wag       | Dog       |
| 1       | Wag       | Dog       |
| 2       | Scratch   | Cat       |
| 3       | Tweet     | Bird      |
| 4       | Bark      | Dog       |
| 4       | Bark      | Dog       |
| 4       | Bark      | Dog       |
+---------+-----------+-----------+

Можем да видим, че първите два реда са дублирани, както и последните три реда.

Изберете дубликати

Преди да премахнем дублирането на таблицата, можем да използваме следната заявка, за да видим кой ред/и ще бъдат изтрити:

WITH CTE AS 
    (
        SELECT 
            *, 
            ROW_NUMBER() OVER ( 
                PARTITION BY PetId, PetName, PetType 
                ORDER BY PetId, PetName, PetType
                ) AS Row_Number
        FROM Pets
    )
SELECT * FROM CTE WHERE Row_Number <> 1;

Резултат:

+---------+-----------+-----------+--------------+
| PetId   | PetName   | PetType   | Row_Number   |
|---------+-----------+-----------+--------------|
| 1       | Wag       | Dog       | 2            |
| 4       | Bark      | Dog       | 2            |
| 4       | Bark      | Dog       | 3            |
+---------+-----------+-----------+--------------+

Изтриване на дубликати

За да изтрием дублиращи се стойности, можем да променим горната заявка, като заменим SELECT * на последния ред с DELETE :

WITH CTE AS 
    (
        SELECT 
            *, 
            ROW_NUMBER() OVER ( 
                PARTITION BY PetId, PetName, PetType 
                ORDER BY PetId, PetName, PetType
                ) AS Row_Number
        FROM Pets
    )
DELETE FROM CTE WHERE Row_Number <> 1;

Резултат:

(3 rows affected)

Таблицата вече е премахната.

Можем да проверим това, като изберем отново всички редове:

SELECT * FROM Pets;

Резултат:

+---------+-----------+-----------+
| PetId   | PetName   | PetType   |
|---------+-----------+-----------|
| 1       | Wag       | Dog       |
| 2       | Scratch   | Cat       |
| 3       | Tweet     | Bird      |
| 4       | Bark      | Dog       |
+---------+-----------+-----------+

Както се очакваше, един от дублиращите се редове за нашето куче „Wag” е изтрит, а другият остава. Два от дублиращите се редове за „Кора“ също бяха изтрити. Таблицата е успешно премахната.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да потърся Xml стойности и атрибути от таблица в SQL Server?

  2. Как да вмъкнете C# списък в база данни с помощта на Dapper.NET

  3. Обединете два дяла в един в SQL Server (T-SQL)

  4. Как да изпратите по имейл резултатите от заявката като прикачен файл в SQL Server (T-SQL)

  5. Възможно ли е изтриване от множество таблици в един и същ SQL израз?