Database
 sql >> база данни >  >> RDS >> Database

Как да намерите дублиращи се стойности в SQL таблица

Като цяло, най-добрата практика е да поставите уникални ограничения върху таблица, за да предотвратите дублиране на редове. Въпреки това, може да се окажете, че работите с база данни, където дублиращи се редове са създадени поради човешка грешка, грешка във вашето приложение или непочистени данни от външни източници. Този урок ще ви научи как да намерите тези дублиращи се редове.

За да продължите, ще ви трябва достъп за четене до вашата база данни и инструмент за запитване на вашата база данни.

Идентифициране на дублиращи се критерии

Първата стъпка е да дефинирате вашите критерии за дублиран ред. Имате ли нужда от комбинация от две колони, за да бъдат уникални заедно, или просто търсите дубликати в една колона? В този пример търсим дубликати в две колони в нашата таблица с потребители:потребителско име и имейл.

Напишете заявка за потвърждаване на съществуването на дубликати

Първата заявка, която ще напишем, е проста заявка за проверка дали дубликати наистина съществуват в таблицата. За нашия пример моята заявка изглежда така:

SELECT username, email, COUNT(*)
FROM users
GROUP BY username, email
HAVING COUNT(*) > 1

HAVING е важно тук, защото за разлика от WHERE , HAVING филтри върху агрегатни функции.

Ако бъдат върнати някакви редове, това означава, че имаме дубликати. В този пример нашите резултати изглеждат така:

потребителско име имейл брой
Пийт [email protected] 2
Джесика [email protected] 2
Мили [email protected] 2

Списък на всички редове, съдържащи дубликати

В предишната стъпка нашата заявка върна списък с дубликати. Сега искаме да върнем целия запис за всеки дублиран ред.

За да постигнем това, ще трябва да изберем цялата таблица и да я присъединим към нашите дублиращи се редове. Нашата заявка изглежда така:

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

Ако погледнете внимателно, ще видите, че тази заявка не е толкова сложна. Първоначалният SELECT просто избира всяка колона в таблицата с потребители и след това inner я присъединява към таблицата с дублирани данни от първоначалната ни заявка. Тъй като свързваме таблицата със самата нея, е необходимо да използваме псевдоними (тук използваме a и b), за да обозначим двете версии.

Ето как изглеждат нашите резултати за тази заявка:

id потребителско име имейл
1 Пийт [email protected]
6 Пийт [email protected]
12 Джесика [email protected]
13 Джесика [email protected]
2 Мили [email protected]
9 Мили [email protected]

Тъй като този набор от резултати включва всички идентификатори на редове, можем да го използваме, за да ни помогне да премахнем дублирането на редовете по-късно.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Базиране на модели на бази данни в реалността:Предизвикателството на блогъра

  2. Съвети на UniVerse

  3. Оперативен анализ в реално време и индекс на хранилище на неклъстерни колони

  4. Подреждане на данни за дата и час

  5. Заобиколно решение за:Курсорите не се поддържат в таблица, която има клъстериран индекс на columnstore