Ако смятате, че MySQL таблица може да има дублиращи се редове, можете да използвате следните опции, за да върнете всички дублирани.
Примерни данни
Да предположим, че имаме таблица със следните данни:
ИЗБЕРЕТЕ * ОТ домашни любимци;
Резултат:
<пред>+-------+--------+--------+| PetId | Име на домашни любимци | PetType |+-------+--------+--------+| 1 | Размахване | Куче || 1 | Размахване | Куче || 2 | Надраскване | Котка || 3 | Tweet | Птица || 4 | Кора | Куче || 4 | Кора | Куче || 4 | Кора | Куче |+-------+--------+--------+Първите два реда са дублирани, както и последните три реда. Дублиращите се редове споделят едни и същи стойности във всички колони.
Опция 1
Една от опциите е да използвате следната заявка за връщане на дублиращи се редове:
ИЗБЕРЕТЕ DISTINCT PetId, COUNT(*) КАТО "Брой" ОТ PetsGROUP BY PetIdORDER BY PetId;
Резултат:
+-------+-------+| PetId | Брой |+-------+-------+| 1 | 2 || 2 | 1 || 3 | 1 || 4 | 3 |+-------+-------+
Можем да разширим SELECT
списък, за да включите още колони, ако е необходимо:
ИЗБЕРЕТЕ PetId, PetName, PetType, COUNT(*) КАТО "Брой" ОТ PetsGROUP ПО PetId, PetName, PetTypeORDER BY PetId;
Резултат:
+-------+--------+--------+-------+| PetId | Име на домашни любимци | PetType | Брой |+-------+--------+--------+-------+| 1 | Размахване | Куче | 2 || 2 | Надраскване | Котка | 1 || 3 | Tweet | Птица | 1 || 4 | Кора | Куче | 3 |+-------+--------+-------+-------+
Можем да накараме дубликатите да се показват първи, като ги подредим по брой в низходящ ред:
ИЗБЕРЕТЕ PetId, PetName, PetType, COUNT(*) КАТО "Брой" ОТ PetsGROUP ПО PetId, PetName, PetTypeORDER BY Count DESC;
Резултат:
+-------+--------+--------+-------+| PetId | Име на домашни любимци | PetType | Брой |+-------+--------+--------+-------+| 4 | Кора | Куче | 3 || 1 | Размахване | Куче | 2 || 2 | Надраскване | Котка | 1 || 3 | Tweet | Птица | 1 |+-------+--------+--------+-------+
Опция 2
Ако искаме да изброим само дублиращите се редове, можем да използваме HAVING
клауза за изключване на недублирани от изхода:
ИЗБЕРЕТЕ PetId, PetName, PetType, COUNT(*) КАТО "Брой" ОТ PetsGROUP ПО PetId, PetName, PetTypeHAVING COUNT(*)> 1 ORDER BY PetId;
Резултат:
+-------+--------+--------+-------+| PetId | Име на домашни любимци | PetType | Брой |+-------+--------+--------+-------+| 1 | Размахване | Куче | 2 || 4 | Кора | Куче | 3 |+-------+--------+-------+-------+
Опция 3
Друг начин да го направите е да използвате ROW_NUMBER()
функция с PARTITION BY
клауза за номериране на изхода на резултатния набор.
SELECT *, ROW_NUMBER() НАД ( РАЗДЕЛЯНЕ ПО PetId, PetName, PetType ORDER BY PetId, PetName, PetType ) КАТО rnFROM Pets;
Резултат:
+-------+--------+--------+----+| PetId | Име на домашни любимци | PetType | rn |+-------+--------+--------+----+| 1 | Размахване | Куче | 1 || 1 | Размахване | Куче | 2 || 2 | Надраскване | Котка | 1 || 3 | Tweet | Птица | 1 || 4 | Кора | Куче | 1 || 4 | Кора | Куче | 2 || 4 | Кора | Куче | 3 |+-------+--------+-------+----+
РАЗДЕЛЯНЕ ПО
клаузата разделя резултатния набор, произведен от FROM
клауза в дялове, към които се прилага функцията. Когато посочим дялове за резултатния набор, всеки дял кара номерирането да започне отново (т.е. номерирането ще започне от 1 за първия ред във всеки дял).
Опция 4
За да върнем само излишните редове от съвпадащите дубликати, можем да използваме горната заявка като общ табличен израз, както следва:
С cte КАТО ( SELECT *, ROW_NUMBER() НАД ( PARTITION BY PetId, PetName, PetType ORDER BY PetId, PetName, PetType ) КАТО rn ОТ домашни любимци )SELECT * FROM cte КЪДЕ rn <> 1;код>
Резултат:
+-------+--------+--------+----+| PetId | Име на домашни любимци | PetType | rn |+-------+--------+--------+----+| 1 | Размахване | Куче | 2 || 4 | Кора | Куче | 2 || 4 | Кора | Куче | 3 |+-------+--------+-------+----+