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