Často se stává, že v určité tabulce potřebujete zjistit, zda neobsahuje duplicitní záznamy – a pak většinou zjistit, které konkrétně jsou duplicitní. Někdy stačí nezkontrolovat JOIN, který výsledek rozmnoží, nebo může jít i o duplicitu na vstupu. Při zpracování v Datawarehousu, se pak může stát, že nepůjde zapnout unique constraint – nejčastěji v podobě přirozeného klíče, v tom horším případě za vámi rovnou přijde někdo z business oddělení s tím, že ta čísla jsou špatně.
Nejjednodušší a nejuniverálnější postup jak duplicity najít, je spuštění následujícího scriptu:
select [Sloupce klíče] , count(*) from [TABULKA] group by [Sloupce klíče] having count(*) > 1 order by [Sloupce klíče]
Jak to funguje:
Jednoduchý script, který zjistí kolikrát se daná kombinace pro sloupce klíče vyskytuje v tabulce. Klauzule having pak zajistí, že se nám zobrazí pouze kombinace, které se vyskytují více než jednou (tedy kombinace našich duplicit).
Toto však nemusí stačit – často je potřeba vidět i ostatní sloupečky tabulky, než jen sloupce našeho klíče a zjistit, ve kterých sloupcích se jednotlivé záznamy liší (a jestli vůbec) – a co tedy způsobuje duplicitu.
Můžeme tedy select jednoduše rozšířit:
select * from [TABULKA]
where ( [Sloupce klíče] ) in (
select [Sloupce klíče] from [TABULKA]
group by [Sloupce klíče]
having count(*) > 1
)
order by [Sloupce klíče]
Tento select nám krásně ukáže všechny duplicitní záznamy (a seřadí je k sobě).
Bylo nutné však provézt některé úpravy. Podstata selectu je však jasná – chceme vybrat všechny sloupce z naší tabulky, a vybíráme pouze takové záznamy, pro které je kombinace našich klíčivých sloupců jednou z těch, ve které se vyskytují duplicity – ty jsme vybrali v předchozím selectu.
Právě klauzule where (sloupec1, sloupec2) in (select sloupec1, sloupec2 ...)
nám jednoduše umožní najít tyto kombinace. Operátor IN lze totiž použít pro zjištění zda je hodnota obsažená v seznamu (množině) definovaných hodnot jako where sloupec1 in ('možnost1', 'možnost2')
ale také pro množinové operace – tzn. pokud kombinace našich hodnot je jednou z kombinací v dané množině) – where (s1, s2, s3) in (select m.s1,m.s2,m.s3 from mnozina m)
. Pro to, abychom toto mohli využít zároveň musíme odebrat sloupec count(*)
, který nám předtím počítal počty kombinací, je nutné aby select vracel stejné typy a počet sloupců jako máme definováno v klauzuli IN.
Dále jednoduše výsledné řádky můžeme seřadit podle našeho klíče – o zároveň zajistí, že ty řádky, které mají stejnou kombinaci budou u sebe.
Jako naše [Sloupce klíče] se nejčastěji používá právě kombinace sloupců tvořící přirozený klíč, případně jiný unikátní index. Primární klíč využijete spíše u databází systému, v DWH je pak jako primární klíč většinou použit surrogate key, který není odovzen z dat, ale je generován ze sekvence, a obvykle na něm tedy duplicity nevznikají.
Dále, když si select prohlédnete, tak zjistíte, že jeho struktura je vždy stejná, jen se mění dvě části které jednoduše můžete rozkopírovat – a to jméno tabulky a seznam sloupců klíče – sloupec ale může být jen jeden. Tato šablona je tedy výborný kandidát na uložení