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

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

Проблем:

Имате дублиращи се редове във вашата таблица, като само идентификаторите са уникални. Как намирате тези дублиращи се записи?

Пример:

Нашата база данни има таблица с име product с данни в следните колони:id , name и category .

id име категория
1 пържола месо
2 торта сладкиши
3 d>пържола месо
4 свинско месо
5 торта сладкиши
6 торта сладкиши

Нека намерим дублиращи се имена и категории продукти. Можете да намерите дубликати, като групирате редове, като използвате COUNT агрегатна функция и посочване на HAVING клауза, с която да филтрирате редове.

Решение:

SELECT  name,
 category,
FROM product
GROUP BY name, category
HAVING COUNT(id) >1;

Тази заявка връща само дублиращи се записи – такива, които имат едно и също име на продукт и категория:

name категория
пържола месо
торта сладкиши

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

Дискусия:

За да изберете дублиращи се стойности, трябва да създадете групи от редове със същите стойности и след това да изберете групите с брой по-голям от един. Можете да постигнете това, като използвате GROUP BY и HAVING клауза.

Първата стъпка е да създадете групи от записи с еднакви стойности във всички колони без идентификатор (в нашия пример name и category ). Правите това с GROUP BY клауза. След GROUP BY ключова дума, вие поставяте имената на колоните, които искате да използвате за групиране. Изключваме id колона, защото това е първичният ключ на нашата таблица; по дефиниция всеки ред ще има различна стойност под тази колона. Ако го включим, няма да можем да открием дубликати!

Искаме да намерим групи с повече от един ред; такива групи трябва да съдържат дубликат по дефиниция, стига да сме групирани в правилните колони. За да направим това, използваме HAVING клауза. Условието, което посочваме, е броят на елементите в групата—COUNT(id) —трябва да е по-голямо от едно:COUNT(id) > 1 . Не забравяйте, че HAVING ви позволява да филтрирате групи; WHERE е за филтриране на отделни редове.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Основи на табличните изрази, част 10 – Изгледи, SELECT * и промени в DDL

  2. Изследване на API на модулите в Java 9

  3. SQL Union – Изчерпателно ръководство за оператора UNION

  4. Правите ли тези грешки, когато използвате SQL CURSOR?

  5. Анонимизиране на косвени идентификатори за по-нисък риск от повторно идентифициране