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 | 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 | |
---|---|---|
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.