SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

2 cách để xóa các hàng trùng lặp trong SQLite

Các tùy chọn sau có thể được sử dụng để xóa các hàng trùng lặp trong SQLite.

Những ví dụ này xóa các hàng trùng lặp nhưng giữ lại một hàng. Vì vậy, nếu có ba hàng giống nhau chẳng hạn, nó sẽ xóa hai hàng trong số đó và giữ lại một hàng. Điều này thường được gọi là khử trùng bảng.

Dữ liệu Mẫu

Giả sử chúng ta có một bảng với dữ liệu sau:

SELECT * FROM Pets;

Kết quả:

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

Chúng ta có thể thấy rằng hai hàng đầu tiên là trùng lặp, ba hàng cuối cùng cũng vậy.

Trong trường hợp này, tất cả các cột đều trùng lặp. Không có khóa chính. PetId cột có thể nhìn giống như nó có thể là một khóa chính, nhưng nó thực sự chứa các giá trị trùng lặp. Do đó, nó không phải là một số nhận dạng duy nhất cho mỗi hàng và nó không thể được sử dụng làm khóa chính.

Nếu có một khóa chính, nó sẽ chứa các giá trị duy nhất trên tất cả các hàng và sẽ không có bản sao.

Trong mọi trường hợp, dưới đây là hai tùy chọn để tìm và xóa các hàng trùng lặp.

Tùy chọn 1

Trước khi xóa bảng, chúng ta có thể sử dụng truy vấn sau để xem hàng / s nào sẽ bị xóa:

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
);

Kết quả:

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

Điều này cho chúng ta thấy rằng ba hàng sẽ bị xóa khi chúng ta xóa bảng trong bước tiếp theo.

Để xóa các giá trị trùng lặp, chúng tôi có thể sửa đổi truy vấn trên bằng cách thay thế SELECT * với 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;

Kết quả:

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

Bảng hiện đã được gỡ bỏ.

Như mong đợi, một trong những hàng trùng lặp cho chú chó “Wag” của chúng tôi đã bị xóa và hàng còn lại vẫn còn. Hai trong số các hàng trùng lặp cho “Bark” cũng đã bị xóa.

Lý do chúng tôi có thể làm điều này là do rowid của SQLite . Theo mặc định, mỗi hàng trong SQLite có một cột đặc biệt, thường được gọi là rowid , xác định duy nhất hàng đó trong bảng. Trừ khi nó đã bị xóa khỏi bảng một cách rõ ràng, bạn có thể sử dụng nó làm số nhận dạng duy nhất cho mỗi hàng, điều này cho phép chúng tôi tạo các truy vấn ở trên. Điều tương tự cũng áp dụng cho ví dụ tiếp theo.

Tùy chọn 2

Giả sử bảng đã được khôi phục với dữ liệu ban đầu của nó (bao gồm cả các hàng trùng lặp), đây là một tùy chọn khác để loại bỏ lỗi.

Kiểm tra những hàng nào sẽ bị xóa:

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

Kết quả:

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

Bây giờ hãy xóa các hàng đó:

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

SELECT * FROM Pets;

Kết quả:

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

Bảng đã được gỡ bỏ.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Android:Cách tải hình ảnh động từ máy chủ theo tên của nó từ SQlite

  2. Sử dụng Room DB trong dự án thư viện

  3. Đặt giá trị mặc định của một cột số nguyên SQLite

  4. Nhận ID hàng của bảng SQLite FTS3

  5. Sử dụng SQLCipher với Android