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

Cách tìm giá trị trùng lặp trong bảng SQL

Nói chung, cách tốt nhất là đặt các ràng buộc duy nhất trên bảng để ngăn các hàng trùng lặp. Tuy nhiên, bạn có thể thấy mình đang làm việc với cơ sở dữ liệu nơi các hàng trùng lặp đã được tạo do lỗi của con người, lỗi trong ứng dụng của bạn hoặc dữ liệu chưa được làm sạch từ các nguồn bên ngoài. Hướng dẫn này sẽ dạy bạn cách tìm các hàng trùng lặp này.

Để làm theo, bạn sẽ cần quyền truy cập đọc vào cơ sở dữ liệu của mình và một công cụ để truy vấn cơ sở dữ liệu của bạn.

Xác định Tiêu chí Trùng lặp

Bước đầu tiên là xác định tiêu chí của bạn cho một hàng trùng lặp. Bạn cần sự kết hợp của hai cột để trở thành duy nhất với nhau hay bạn chỉ đơn giản là tìm kiếm các bản sao trong một cột duy nhất? Trong ví dụ này, chúng tôi đang tìm kiếm các bản sao trên hai cột trong bảng Người dùng của chúng tôi:tên người dùng và email.

Viết Truy vấn để Xác minh Tồn tại Trùng lặp

Truy vấn đầu tiên chúng ta sẽ viết là một truy vấn đơn giản để xác minh xem các bản sao có thực sự tồn tại trong bảng hay không. Đối với ví dụ của chúng tôi, truy vấn của tôi trông giống như sau:

SELECT username, email, COUNT(*)
FROM users
GROUP BY username, email
HAVING COUNT(*) > 1

HAVING ở đây là quan trọng vì không giống như WHERE , HAVING bộ lọc trên các chức năng tổng hợp.

Nếu bất kỳ hàng nào được trả về, điều đó có nghĩa là chúng tôi có các bản sao. Trong ví dụ này, kết quả của chúng tôi trông như thế này:

tên người dùng email số lượng
Pete [email protected] 2
Jessica [email protected] 2
Dặm [email protected] 2

Liệt kê tất cả các hàng có chứa trùng lặp

Trong bước trước, truy vấn của chúng tôi trả về một danh sách các bản sao. Bây giờ, chúng tôi muốn trả lại toàn bộ bản ghi cho mỗi hàng trùng lặp.

Để thực hiện điều này, chúng tôi sẽ cần chọn toàn bộ bảng và nối bảng đó với các hàng trùng lặp của chúng tôi. Truy vấn của chúng tôi trông giống như sau:

SELECT a.*
FROM users a
JOIN (SELECT username, email, COUNT(*)
FROM users 
GROUP BY username, email
HAVING count(*) > 1 ) b
ON a.username = b.username
AND a.email = b.email
ORDER BY a.email

Nếu quan sát kỹ, bạn sẽ thấy rằng truy vấn này không quá phức tạp. SELECT ban đầu chỉ cần chọn mọi cột trong bảng người dùng, sau đó kết hợp bên trong nó với bảng dữ liệu được sao chép từ truy vấn ban đầu của chúng tôi. Vì chúng tôi đang tham gia bảng với chính nó, nên cần phải sử dụng bí danh (ở đây, chúng tôi đang sử dụng a và b) để gắn nhãn hai phiên bản.

Đây là kết quả của chúng tôi trông như thế nào cho truy vấn này:

id tên người dùng email
1 Pete [email protected]
6 Pete [email protected]
12 Jessica [email protected]
13 Jessica [email protected]
2 Dặm [email protected]
9 Dặm [email protected]

Vì tập hợp kết quả này bao gồm tất cả id hàng, chúng tôi có thể sử dụng nó để giúp loại bỏ trùng lặp các hàng sau này.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Di chuyển cơ sở dữ liệu SQL với dòng lệnh

  2. Các loại SQL JOIN

  3. Kết nối RazorSQL với Salesforce.com

  4. Cách không gọi các thủ tục lưu trữ được biên dịch tự nhiên của Hekaton

  5. Hiểu 3 đặc điểm chính của Dữ liệu lớn