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

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

Các tùy chọn sau có thể được sử dụng để xóa các hàng trùng lặp trong Cơ sở dữ liệu Oracle.

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ó cột khóa chính. Thông thường, người ta có thể mong đợi PetId là một khóa chính, nhưng nó chứa các giá trị trùng lặp và do đó không thể là một khóa chính.

Nếu đó là 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.

Bất kể, bên dưới là hai tùy chọn để tìm và xóa các hàng trùng lặp ngay cả khi không có khóa chính.

Tùy chọn 1

Dưới đây là một tùy chọn để xóa các hàng trùng lặp khỏi bảng trên:

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ả:

3 row(s) deleted.

PETID	PETNAME	PETTYPE
1	Wag	Dog
2	Scratch	Cat
3	Tweet	Bird
4	Bark	Dog

Bảng hiện đã được gỡ bỏ. Ba hàng đã bị xóa và bốn hàng vẫn còn.

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.

rowid của Oracle pseudocolumn cho phép chúng tôi thực hiện thao tác de-dupe này. Chúng tôi có thể tham chiếu nó trong truy vấn của mình để xác định những hàng nào cần xóa.

Cách hoạt động của điều này là, mỗi hàng trong cơ sở dữ liệu Oracle có một rowid cột giả trả về địa chỉ của hàng. rowid là mã định danh duy nhất cho các hàng trong bảng và thường giá trị của nó xác định duy nhất một hàng trong cơ sở dữ liệu. Do đó, chúng tôi có thể xác định từng hàng ngay cả khi chúng tôi không có khóa chính hoặc một số trường ID duy nhất khác.

Tuy nhiên, điều quan trọng cần lưu ý là các hàng trong các bảng khác nhau được lưu trữ cùng nhau trong cùng một cụm có thể có cùng một rowid .

Tùy chọn 2

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

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

Kết quả tương tự như ví dụ trước.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle:Làm thế nào để biết được có một giao dịch đang chờ xử lý hay không?

  2. Truy vấn Oracle Pivot đưa ra các cột có dấu ngoặc kép xung quanh tên cột. Gì?

  3. Làm thế nào để bạn biết một chỉ số tốt là gì?

  4. Nhận danh sách tất cả các bảng trong Oracle?

  5. Tại sao mẫu ngủ đông này số lượng lớn