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

6 начина за избор на дублиращи се редове в SQLite

Следните заявки могат да се използват за връщане на дублиращи се редове в 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 

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Таблицата не се създава sqlite android

  2. API на стаята - Как да извлечем наскоро въведен генериран идентификатор на обекта?

  3. Как работи Coalesce() в SQLite

  4. Android - актуализирайте клиентска база данни sqlite с помощта на GCM

  5. Задайте стойност по подразбиране за колона в SQLite:Ограничение по подразбиране