Проблем:
Имате дублиращи се редове във вашата таблица, като само идентификаторите са уникални. Как намирате тези дублиращи се записи?
Пример:
Нашата база данни има таблица с име 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
е за филтриране на отделни редове.