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

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

Следните опции могат да се използват за изтриване на дублиращи се редове в SQLite.

Тези примери изтриват дублиращи се редове, но запазват един. Така че, ако има три еднакви реда например, той изтрива два от тях и запазва един. Това често се нарича премахване на дупли на масата.

Примерни данни

Да предположим, че имаме таблица със следните данни:

SELECT * FROM Pets;

Резултат:

PetId  PetName  PetType
-----  -------  -------
1      Wag      Dog    
1      Wag      Dog    
2      Scratch  Cat    
3      Tweet    Bird   
4      Bark     Dog    
4      Bark     Dog    
4      Bark     Dog    

Можем да видим, че първите два реда са дублирани, както и последните три реда.

В този случай всички колони са дублирани. Няма първичен ключ. PetId колоната може да изглежда сякаш може да е първичен ключ, но всъщност съдържа дублиращи се стойности. Следователно, това не е уникален идентификатор за всеки ред и не може да се използва като първичен ключ.

Ако имаше първичен ключ, той щеше да съдържа уникални стойности във всички редове и нямаше да има дубликати.

Във всеки случай, по-долу са две опции за намиране и изтриване на дублиращи се редове.

Опция 1

Преди да премахнем дублирането на таблицата, можем да използваме следната заявка, за да видим кой ред/и ще бъдат изтрити:

SELECT * FROM Pets
WHERE EXISTS (
  SELECT 1 FROM Pets p2 
  WHERE Pets.PetName = p2.PetName
  AND Pets.PetType = p2.PetType
  AND Pets.rowid > p2.rowid
);

Резултат:

PetId  PetName  PetType
-----  -------  -------
1      Wag      Dog    
4      Bark     Dog    
4      Bark     Dog    

Това ни показва, че три реда ще бъдат изтрити, когато премахнем дублирането на таблицата в следващата стъпка.

За да изтрием дублиращите се стойности, можем да променим горната заявка, като заменим SELECT * с DELETE :

DELETE FROM Pets
WHERE EXISTS (
  SELECT 1 FROM Pets p2 
  WHERE Pets.PetName = p2.PetName
  AND Pets.PetType = p2.PetType
  AND Pets.rowid > p2.rowid
);

SELECT * FROM Pets;

Резултат:

PetId  PetName  PetType
-----  -------  -------
1      Wag      Dog    
2      Scratch  Cat    
3      Tweet    Bird   
4      Bark     Dog    

Таблицата вече е премахната.

Както се очакваше, един от дублиращите се редове за нашето куче „Wag” е изтрит, а другият остава. Два от дублиращите се редове за „Кора“ също бяха изтрити.

Причината, поради която успяхме да направим това, е поради rowid на SQLite . По подразбиране всеки ред в SQLite има специална колона, обикновено наричана rowid , който уникално идентифицира този ред в таблицата. Освен ако не е премахнат изрично от таблицата, можете да го използвате като уникален идентификатор за всеки ред, което ни позволява да изградим горните заявки. Същото важи и за следващия пример.

Опция 2

Ако приемем, че таблицата е била възстановена с оригиналните си данни (включително дублиращи се редове), ето още една опция за премахването й.

Проверете кои редове ще бъдат изтрити:

SELECT * FROM Pets
WHERE rowid > (
  SELECT MIN(rowid) FROM Pets p2  
  WHERE Pets.PetName = p2.PetName
  AND Pets.PetType = p2.PetType
);

Резултат:

PetId  PetName  PetType
-----  -------  -------
1      Wag      Dog    
4      Bark     Dog    
4      Bark     Dog    

Сега изтрийте тези редове:

DELETE FROM Pets
WHERE rowid > (
  SELECT MIN(rowid) FROM Pets p2  
  WHERE Pets.PetName = p2.PetName
  AND Pets.PetType = p2.PetType
);

SELECT * FROM Pets;

Резултат:

PetId  PetName  PetType
-----  -------  -------
1      Wag      Dog    
2      Scratch  Cat    
3      Tweet    Bird   
4      Bark     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 таблица

  2. SQLite - Импортиране на данни от CSV файл

  3. SQLite - Пуснете таблица

  4. Предупреждение по време на компилиране в Android Room за колона във външен ключ, която не е част от индекс. Какво означава?

  5. SQLite - Създайте таблица