Thứ Năm, 10 tháng 8, 2023

Cách tìm bản ghi trùng lặp trong Oracle/PostgreSQL/MySQL/SQL Server

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 fruitsbao 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 fruitsbả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ừ  fruitsbảng:

SELECT * FROM fruits;   
Ngôn ngữ mã:  SQL (Ngôn ngữ truy vấn có cấu trúc)  ( sql )
Cách tìm bản ghi trùng lặp trong Oracle - bảng mẫu

Như bạn có thể thấy từ hình trên, fruitsbả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_namevà  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ừ fruitsbả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 đề SELECTvà GROUP BYSau đó 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 )
Cách tìm các bản ghi trùng lặp trong ví dụ về Oracle

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 HAVINGmệ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 )
hàng trùng lặp

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 BYtrê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 đề WHEREhoặ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

=============================
Cách tìm bản ghi trùng lặp trong Oracle/PostgreSQL/MySQL/SQL Server, oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master