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.