sql >> Databasteknik >  >> RDS >> Sqlserver

Ta bort dubbletter av rader i SQL Server

Följande exempel använder T-SQL för att ta bort dubbletter av rader i SQL Server.

För att vara mer specifik tar den bort dubbletter av rader men behåller en. Så om du har två identiska rader, tar den bort en av dem och behåller den andra. Med andra ord, det deduperar tabellen.

Exempeldata

Anta att vi har en tabell med följande data:

SELECT * FROM Pets;

Resultat:

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

Vi kan se att de två första raderna är dubbletter, liksom de tre sista raderna.

Välj Dubbletter

Innan vi de-duperar tabellen kan vi använda följande fråga för att se vilka rader som kommer att raderas:

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;

Resultat:

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

Ta bort dubbletter

För att ta bort dubbletter av värden kan vi ändra ovanstående fråga genom att ersätta SELECT * på sista raden med 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;

Resultat:

(3 rows affected)

Tabellen har nu avduperats.

Vi kan verifiera detta genom att markera alla rader igen:

SELECT * FROM Pets;

Resultat:

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

Som väntat har en av dubblettraderna för vår hund "Wag" raderats och den andra finns kvar. Två av dubblettraderna för "Bark" har också tagits bort. Tabellen har avduperats.


  1. Hur parallella planer startar – del 2

  2. Hur hittar du radantalet för alla dina bord i Postgres

  3. Göra dina databaskomponenter mycket tillgängliga (HA) via lastbalanserare

  4. Hur man hittar ett listobjekt på en specificerad position i MySQL