Obecně je osvědčeným postupem umístit na tabulku jedinečná omezení, aby se zabránilo duplicitním řádkům. Může se vám však stát, že pracujete s databází, kde byly duplicitní řádky vytvořeny lidskou chybou, chybou ve vaší aplikaci nebo nevyčištěnými daty z externích zdrojů. Tento tutoriál vás naučí, jak najít tyto duplicitní řádky.
Abyste mohli pokračovat, budete potřebovat přístup pro čtení k vaší databázi a nástroj pro dotazování vaší databáze.
Identifikujte duplicitní kritéria
Prvním krokem je definovat kritéria pro duplicitní řádek. Potřebujete kombinaci dvou sloupců, aby byla jedinečná, nebo jednoduše hledáte duplikáty v jednom sloupci? V tomto příkladu hledáme duplikáty ve dvou sloupcích v naší tabulce Uživatelé:uživatelské jméno a e-mail.
Zapsat dotaz pro ověření existence duplikátů
První dotaz, který napíšeme, je jednoduchý dotaz na ověření, zda v tabulce skutečně existují duplikáty. V našem příkladu můj dotaz vypadá takto:
SELECT username, email, COUNT(*)
FROM users
GROUP BY username, email
HAVING COUNT(*) > 1
HAVING je zde důležité, protože na rozdíl od WHERE , HAVING filtry agregačních funkcí.
Pokud jsou vráceny nějaké řádky, znamená to, že máme duplikáty. V tomto příkladu naše výsledky vypadají takto:
| uživatelské jméno | počet | |
|---|---|---|
| Pete | pete@example.com | 2 |
| Jessica | jessica@example.com | 2 |
| Míle | miles@example.com | 2 |
Vypsat všechny řádky obsahující duplikáty
V předchozím kroku náš dotaz vrátil seznam duplikátů. Nyní chceme vrátit celý záznam pro každý duplicitní řádek.
Abychom toho dosáhli, budeme muset vybrat celou tabulku a připojit ji k našim duplicitním řádkům. Náš dotaz vypadá takto:
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
Když se podíváte pozorně, uvidíte, že tento dotaz není tak složitý. Počáteční SELECT jednoduše vybere každý sloupec v tabulce uživatelů a poté jej vnitřní spojí s duplikovanou datovou tabulkou z našeho počátečního dotazu. Protože tabulku spojujeme k sobě, je nutné použít aliasy (zde používáme a a b) k označení dvou verzí.
Takto vypadají naše výsledky pro tento dotaz:
| id | uživatelské jméno | |
|---|---|---|
| 1 | Pete | pete@example.com |
| 6 | Pete | pete@example.com |
| 12 | Jessica | jessica@example.com |
| 13 | Jessica | jessica@example.com |
| 2 | Míle | miles@example.com |
| 9 | Míle | miles@example.com |
Protože tato sada výsledků obsahuje všechna ID řádků, můžeme ji použít k pozdějšímu deduplikování řádků.