Problém:
V tabulce máte duplicitní řádky, přičemž pouze ID jsou jedinečná. Jak najdete tyto duplicitní záznamy?
Příklad:
Naše databáze obsahuje tabulku s názvem product s údaji v následujících sloupcích:id , name a category .
| id | jméno | kategorie |
|---|---|---|
| 1 | steak | maso |
| 2 | dort | sladkosti |
| 3 | d>steak | maso |
| 4 | vepřové | maso |
| 5 | dort | sladkosti |
| 6 | dort | sladkosti |
Pojďme najít duplicitní názvy a kategorie produktů. Duplikáty můžete najít seskupením řádků pomocí COUNT agregační funkce a určení HAVING klauzule, pomocí které lze filtrovat řádky.
Řešení:
SELECT name, category, FROM product GROUP BY name, category HAVING COUNT(id) >1;
Tento dotaz vrací pouze duplicitní záznamy – ty, které mají stejný název produktu a kategorii:
| name | kategorie |
|---|---|
| steak | maso |
| dort | sladkosti |
V naší tabulce jsou dva duplicitní produkty:steak z kategorie maso a koláč z kategorie sladkosti. První produkt se v tabulce opakuje dvakrát, zatímco druhý se objeví třikrát.
Diskuse:
Chcete-li vybrat duplicitní hodnoty, musíte vytvořit skupiny řádků se stejnými hodnotami a poté vybrat skupiny s počty větším než jedna. Můžete toho dosáhnout pomocí GROUP BY a HAVING doložka.
Prvním krokem je vytvoření skupin záznamů se stejnými hodnotami ve všech sloupcích bez ID (v našem příkladu name a category ). To provedete pomocí GROUP BY doložka. Po GROUP BY klíčové slovo, zadáte názvy sloupců, které chcete použít pro seskupení. Vylučujeme id sloupec, protože je to primární klíč naší tabulky; podle definice bude mít každý řádek pod tímto sloupcem jinou hodnotu. Pokud bychom to zahrnuli, pak bychom nebyli schopni detekovat duplikáty!
Chceme najít skupiny s více než jedním řádkem; takové skupiny musí podle definice obsahovat duplikát, pokud jsme seskupili do správných sloupců. K tomu používáme HAVING doložka. Podmínkou, kterou zadáváme, je, že počet prvků ve skupině — COUNT(id) —musí být větší než jedna:COUNT(id) > 1 . Pamatujte, že HAVING umožňuje filtrovat skupiny; WHERE slouží k filtrování jednotlivých řádků.