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 | [email protected] | 2 |
Jessica | [email protected] | 2 |
Míle | [email protected] | 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 | [email protected] |
6 | Pete | [email protected] |
12 | Jessica | [email protected] |
13 | Jessica | [email protected] |
2 | Míle | [email protected] |
9 | Míle | [email protected] |
Protože tato sada výsledků obsahuje všechna ID řádků, můžeme ji použít k pozdějšímu deduplikování řádků.