sql >> Databáze >  >> RDS >> Database

Jak najít duplicitní hodnoty v tabulce SQL

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


  1. Jak zabalit PL SQL kód v Oracle?

  2. SQL Server BULK INSERT z Linuxu

  3. postgresql port zmatení 5433 nebo 5432?

  4. Jak používat cizí klíč v oracle