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