Tóm tắt : trong hướng dẫn này, bạn sẽ học cách tìm các bản ghi trùng lặp trong Cơ sở dữ liệu Oracle.
Cú pháp câu lênh:
SELECT column_name, COUNT(column_name)
FROM table_name
GROUP BY column_name
HAVING COUNT(column_name) > 1;
Từ đó lấy ID và xóa
Hãy bắt đầu bằng cách thiết lập một bảng mẫu cho phần demo chi tiết hơn:
Thiết lập một bảng mẫu
Đầu tiên, câu lệnh sau đây tạo một bảng mới có tên fruits
bao gồm ba cột: id trái cây, tên trái cây và màu sắc (12c với mơí có IDENTITY tự động, còn 11g dùng sequence)
CREATE TABLE fruits (
fruit_id NUMBER generated BY DEFAULT AS IDENTITY,
fruit_name VARCHAR2(100),
color VARCHAR2(20)
);
Ngôn ngữ mã: SQL (Ngôn ngữ truy vấn có cấu trúc) ( sql )
Thứ hai, chèn một số hàng vào fruits
bảng:
INSERT INTO fruits(fruit_name,color) VALUES('Apple','Red');
INSERT INTO fruits(fruit_name,color) VALUES('Apple','Red');
INSERT INTO fruits(fruit_name,color) VALUES('Orange','Orange');
INSERT INTO fruits(fruit_name,color) VALUES('Orange','Orange');
INSERT INTO fruits(fruit_name,color) VALUES('Orange','Orange');
INSERT INTO fruits(fruit_name,color) VALUES('Banana','Yellow');
INSERT INTO fruits(fruit_name,color) VALUES('Banana','Green');
Ngôn ngữ mã: SQL (Ngôn ngữ truy vấn có cấu trúc) ( sql )
Thứ ba, truy vấn dữ liệu từ fruits
bảng:
SELECT * FROM fruits;
Ngôn ngữ mã: SQL (Ngôn ngữ truy vấn có cấu trúc) ( sql )
Như bạn có thể thấy từ hình trên, fruits
bảng có các bản ghi trùng lặp với cùng thông tin được lặp lại ở cả hai cột fruit_name
và cộtcolor
.
Tìm các hàng (row) trùng lặp bằng hàm tổng hợp (hàm count)
Để tìm các hàng trùng lặp từ fruits
bảng, trước tiên bạn liệt kê các cột màu và tên trái cây trong cả hai mệnh đề SELECT
và GROUP BY
. Sau đó bạn đếm số lần xuất hiện mỗi tổ hợp xuất hiện với hàm COUNT(*)
như hình bên dưới:
SELECT
fruit_name,
color,
COUNT(*)
FROM
fruits
GROUP BY
fruit_name,
color;
Ngôn ngữ mã: SQL (Ngôn ngữ truy vấn có cấu trúc) ( sql )
Truy vấn đã trả về một hàng duy nhất cho mỗi tổ hợp tên và màu trái cây. Nó cũng bao gồm các hàng không trùng lặp.
Để chỉ trả về các hàng trùng lặp COUNT(*)
lớn hơn một, bạn thêm một HAVING
mệnh đề như sau:
SELECT
fruit_name,
color,
COUNT(*)
FROM
fruits
GROUP BY
fruit_name,
color
HAVING COUNT(*) > 1;
Ngôn ngữ mã: SQL (Ngôn ngữ truy vấn có cấu trúc) ( sql )
Vì vậy, bây giờ chúng tôi đã nhân đôi bản ghi. Nó hiển thị một hàng cho mỗi bản sao.
Nếu bạn muốn trả về tất cả các hàng, bạn cần truy vấn lại bảng như hình bên dưới:
SELECT *
FROM fruits
WHERE (fruit_name, color) IN
(SELECT fruit_name,
color
FROM fruits
GROUP BY fruit_name,
color
HAVING COUNT(*) > 1
)
ORDER BY fruit_name, color;
Ngôn ngữ mã: SQL (Ngôn ngữ truy vấn có cấu trúc) ( sql )
Bây giờ, chúng tôi có tất cả các hàng trùng lặp được hiển thị trong tập hợp kết quả.
Tìm bản ghi trùng lặp bằng chức năng phân tích
Xem truy vấn sau:
SELECT f.*,
COUNT(*) OVER (PARTITION BY fruit_name, color) c
FROM fruits f;
Ngôn ngữ mã: SQL (Ngôn ngữ truy vấn có cấu trúc) ( sql )
Trong truy vấn này, chúng tôi đã thêm một mệnh đềOVER()
sau COUNT(*)
và đặt một danh sách các cột mà chúng tôi đã kiểm tra các giá trị trùng lặp, sau mệnh đề partition. Mệnh đề partition by chia các hàng thành các nhóm.
Khác với cách sử dụng ở GROUP BY
trên, hàm phân tích giữ nguyên tập kết quả nên bạn vẫn có thể xem tất cả các hàng trong bảng một lần.
Vì bạn có thể sử dụng hàm phân tích trong mệnh đề WHERE
hoặc HAVING bạn cần sử dụng mệnh đềWITH
:
WITH fruit_counts AS (
SELECT f.*,
COUNT(*) OVER (PARTITION BY fruit_name, color) c
FROM fruits f
)
SELECT *
FROM fruit_counts
WHERE c > 1 ;
Ngôn ngữ mã: SQL (Ngôn ngữ truy vấn có cấu trúc) ( sql )
Hoặc bạn cần sử dụng chế độ view nội tuyến :
SELECT
*
FROM
(SELECT f.*,
COUNT(*) OVER (PARTITION BY fruit_name, color) c
FROM fruits f
)
WHERE c > 1;
Ngôn ngữ mã: SQL (Ngôn ngữ truy vấn có cấu trúc) ( sql )
Bây giờ, bạn đã biết cách tìm các bản ghi trùng lặp trong Cơ sở dữ liệu Oracle. Đã đến lúc dọn dẹp dữ liệu của bạn bằng cách xóa các bản ghi trùng lặp .
Website không bao giờ chứa bất kỳ quảng cáo nào, mọi đóng góp để duy trì phát triển cho website (donation) xin vui lòng gửi về STK 90.2142.8888 - Ngân hàng Vietcombank Thăng Long - TRAN VAN BINH
=============================
Nếu bạn muốn tiết kiệm 3-5 NĂM trên con đường trở thành DBA chuyên nghiệp thì hãy đăng ký ngay KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE, được Coaching trực tiếp từ tôi với toàn bộ kinh nghiệm, thủ tục, quy trình, bí kíp thực chiến mà bạn sẽ KHÔNG THỂ tìm kiếm trên Internet/Google giúp bạn dễ dàng quản trị mọi hệ thống Core tại Việt Nam và trên thế giới, đỗ OCP.
- CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
- Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
2 khóa học online qua video giúp bạn nhanh chóng có những kiến thức nền tảng về Linux, Oracle, học mọi nơi, chỉ cần có Internet/4G:
- Oracle cơ bản: https://bit.ly/admin1_1200
- Linux: https://bit.ly/linux_1200
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội
=============================