Database
 sql >> Baza danych >  >> RDS >> Database

Jak znaleźć zduplikowane wartości w tabeli SQL?

Ogólnie rzecz biorąc, najlepszą praktyką jest nałożenie na tabelę unikalnych ograniczeń, aby zapobiec duplikowaniu wierszy. Jednak może się okazać, że pracujesz z bazą danych, w której zduplikowane wiersze zostały utworzone w wyniku błędu ludzkiego, błędu w aplikacji lub nieoczyszczonych danych ze źródeł zewnętrznych. Ten samouczek nauczy Cię, jak znaleźć te zduplikowane wiersze.

Aby kontynuować, potrzebujesz dostępu do odczytu swojej bazy danych i narzędzia do wysyłania zapytań do bazy danych.

Zidentyfikuj kryteria duplikatów

Pierwszym krokiem jest zdefiniowanie kryteriów dla zduplikowanego wiersza. Czy potrzebujesz kombinacji dwóch kolumn, aby były unikalne razem, czy po prostu szukasz duplikatów w jednej kolumnie? W tym przykładzie szukamy duplikatów w dwóch kolumnach w naszej tabeli Użytkownicy:nazwa użytkownika i adres e-mail.

Napisz zapytanie, aby zweryfikować istnienie duplikatów

Pierwsze zapytanie, które napiszemy, to proste zapytanie w celu sprawdzenia, czy w tabeli rzeczywiście istnieją duplikaty. W naszym przykładzie moje zapytanie wygląda tak:

SELECT username, email, COUNT(*)
FROM users
GROUP BY username, email
HAVING COUNT(*) > 1

HAVING jest tutaj ważne, ponieważ w przeciwieństwie do WHERE , HAVING filtry funkcji agregujących.

Jeśli zwrócone zostaną jakiekolwiek wiersze, oznacza to, że mamy duplikaty. W tym przykładzie nasze wyniki wyglądają tak:

nazwa użytkownika e-mail liczba
Piotek [email protected] 2
Jessica [email protected] 2
Mile [email protected] 2

Wyświetl wszystkie wiersze zawierające duplikaty

W poprzednim kroku nasze zapytanie zwróciło listę duplikatów. Teraz chcemy zwrócić cały rekord dla każdego zduplikowanego wiersza.

Aby to osiągnąć, musimy zaznaczyć całą tabelę i połączyć ją z naszymi zduplikowanymi wierszami. Nasze zapytanie wygląda tak:

SELECT a.*
FROM users a
JOIN (SELECT username, email, COUNT(*)
FROM users 
GROUP BY username, email
HAVING count(*) > 1 ) b
ON a.username = b.username
AND a.email = b.email
ORDER BY a.email

Jeśli przyjrzysz się uważnie, zobaczysz, że to zapytanie nie jest tak skomplikowane. Początkowy SELECT po prostu wybiera każdą kolumnę w tabeli users, a następnie internal łączy ją ze zduplikowaną tabelą danych z naszego początkowego zapytania. Ponieważ łączymy tabelę z samą sobą, konieczne jest użycie aliasów (tutaj używamy aib), aby oznaczyć dwie wersje.

Oto jak wyglądają nasze wyniki dla tego zapytania:

id nazwa użytkownika e-mail
1 Pete [email protected]
6 Pete [email protected]
12 Jessica [email protected]
13 Jessica [email protected]
2 Mile [email protected]
9 Mile [email protected]

Ponieważ ten zestaw wyników zawiera wszystkie identyfikatory wierszy, możemy go użyć do późniejszej deduplikacji wierszy.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Praca z danymi Java w Alteryx

  2. System automatycznej poczty e-mail do wysyłania raportu podsumowującego bazy danych

  3. Kluczowe wskaźniki projektowania problemu

  4. N-ta najwyższa pensja

  5. Wzorzec danych referencyjnych:rozszerzalny i elastyczny