Следните заявки могат да се използват за връщане на дублиращи се редове в SQLite.
Тук дублиращите се редове съдържат дублиращи се стойности във всички колони, включително колоната с идентификатор.
Примерни данни
Да предположим, че имаме таблица със следните данни:
ИЗБЕРЕТЕ * ОТ домашни любимци;
Резултат:
PetId PetName PetType------------ -------1 Wag Dog 1 Wag Dog 2 Scratch Cat 3 Tweet Bird 4 Lak Dog 4 Lak Dog 4 Lak Dog
Първите два реда са дублирани, както и последните три реда. Това е така, защото и трите колони съдържат едни и същи стойности във всеки дублиран ред.
Опция 1
Можем да използваме следната заявка, за да видим колко реда са дублирани:
ИЗБЕРЕТЕ PetId, PetName, PetType, COUNT(*) КАТО "Брой" ОТ PetsGROUP ПО PetId, PetName, PetTypeORDER BY PetId;
Резултат:
PetId PetName PetType Count----- ------- ------- -----1 Wag Dog 2 2 Scratch Cat 1 3 Tweet Bird 1 4 Lak Dog 3
Тук групирахме редовете по всички колони и върнахме броя на редовете за всяка група. Това ни казва дали един ред е уникален (с брой 1) или дубликат (с брой, по-голям от 1).
Можем да го подредим по брой в низходящ ред, така че редовете с най-много дубликати да се показват първи:
ИЗБЕРЕТЕ PetId, PetName, PetType, COUNT(*) КАТО "Брой" ОТ PetsGROUP ПО PetId, PetName, PetTypeORDER BY Count(*) DESC;
Резултат:
PetId PetName PetType Count----- ------- ------- -----4 Лаещо куче 3 1 Размахване на куче 2 2 Драскане на котка 1 3 Tweet Bird 1
Опция 2
Ако искаме само изброените дублиращи се редове, можем да използваме HAVING
клауза за връщане само на редове с брой по-голям от 1:
ИЗБЕРЕТЕ PetId, PetName, PetType, COUNT(*) КАТО "Брой" ОТ PetsGROUP ПО PetId, PetName, PetTypeHAVING COUNT(*)> 1 ORDER BY PetId;
Резултат:
PetId PetName PetType Count----- ------- ------- -----1 Wag Dog 2 4 Lak Dog 3
Опция 3
Друга възможност е да използвате ROW_NUMBER()
функция на прозореца:
SELECT *, ROW_NUMBER() НАД ( РАЗДЕЛЯНЕ ПО PetId, PetName, PetType ORDER BY PetId, PetName, PetType ) КАТО Row_NumberFROM Pets;
Резултат:
PetId PetName PetType Row_Number----- ------- ------- ----------1 Wag Dog 1 1 Wag Dog 2 2 Scratch Cat 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 ) КАТО Номер_ред ОТ Домашни любимци )SELECT * FROM cte WHERE Номер_ред <> 1;код>
Резултат:
PetId PetName PetType Row_Number----- ------- ------- ----------1 Wag Dog 2 4 Lak Dog 2 4 Lak Dog 3 предварително>Това връща само излишните редове от съответстващите дубликати. Така че, ако има два еднакви реда, той връща един от тях. Ако има три еднакви реда, той връща два и т.н.
Тази заявка може да бъде полезна за показване на колко реда ще бъдат премахнати от таблицата при операция за премахване на дублиране. В някои други СУБД (поне в SQL Server) можем да заменим последния
SELECT *
сDELETE
за да изтриете дублиращите се редове от таблицата. Но SQLite няма да ни позволи да актуализираме CTE по този начин.За щастие следващите две опции могат да бъдат променени, за да се извърши изтриване.
Опция 5
Можем да се възползваме от
rowid
на SQLite :ИЗБЕРЕТЕ * ОТ PetsWHERE EXISTS ( ИЗБЕРЕТЕ 1 ОТ Домашни любимци p2 WHERE Pets.PetName =p2.PetName И Pets.PetType =p2.PetType И Pets.rowid> p2. rowid);
Резултат:
PetId PetName PetType----- ------- -------1 Wag Dog 4 Laj Dog 4 Lak DogКак работи това? По подразбиране всеки ред в SQLite има специална колона, обикновено наричана
rowid
, който уникално идентифицира този ред в таблицата. Това може да бъде премахнато, ако е необходимо, но освен ако не е премахнато изрично, ще можете да го използвате във вашите заявки.Опция 6
И накрая, ето още една опция, която използва
rowid
на SQLite :ИЗБЕРЕТЕ * ОТ PetsWHERE rowid> ( SELECT MIN(rowid) FROM Pets p2 WHERE Pets.PetName =p2.PetName AND Pets.PetType =p2.PetType);
Резултат:
PetId PetName PetType----- ------- -------1 Wag Dog 4 Laj Dog 4 Lak Dog