Trong các ứng dụng thực tế, việc phát hiện các bản ghi lặp trong các cột là một yêu cầu phổ biến. Tuy nhiên, trong nhiều trường hợp, cần kiểm tra sự trùng lặp giữa các cột trong cùng một nhóm dữ liệu. Ví dụ, với một bảng chứa dữ liệu câu hỏi trắc nghiệm, chúng ta cần đảm bảo rằng các tùy chọn (A, B, C, D) không có giá trị trùng nhau trong cùng một câu hỏi.
Môi Trường Thực Thi
- Hệ điều hành: Windows Server 2019 Standard
- Cơ sở dữ liệu: Microsoft SQL Server 2019
- .NET Framework: 4.8
Mẫu Thiết Kế Dữ Liệu
Bảng dethi được thiết kế như sau:
| ID | Tên Trường | Loại | Mô tả |
|---|---|---|---|
| 1 | cauhoi_id | int | Số thứ tự câu hỏi, duy nhất |
| 2 | loai_cauhoi | nvarchar | Loại câu hỏi (đơn hoặc đa lựa chọn) |
| 3 | noi_dung | nvarchar | Nội dung câu hỏi |
| 4 | A | nvarchar | Lựa chọn A |
| 5 | B | nvarchar | Lựa chọn B |
| 6 | C | nvarchar | Lựa chọn C |
| 7 | D | nvarchar | Lựa chọn D |
Thực Hiện Chức Năng
SQL Statement
Đầu tiên, sử dụng lệnh UNION ALL để ghép nối các cột A đến D thành một tập dữ liệu duy nhất:
SELECT opt AS gia_tri, cauhoi_id FROM dethi WHERE opt = 'A'
UNION ALL
SELECT opt AS gia_tri, cauhoi_id FROM dethi WHERE opt = 'B'
UNION ALL
SELECT opt AS gia_tri, cauhoi_id FROM dethi WHERE opt = 'C'
UNION ALL
SELECT opt AS gia_tri, cauhoi_id FROM dethi WHERE opt = 'D';
Sau đó, dùng câu lệnh GROUP BY và hàm tổng hợp COUNT() để đếm số lần xuất hiện của mỗi giá trị:
SELECT gia_tri, COUNT(gia_tri) so_lan, cauhoi_id
FROM (
SELECT A AS gia_tri, cauhoi_id FROM dethi
UNION ALL
SELECT B AS gia_tri, cauhoi_id FROM dethi
UNION ALL
SELECT C AS gia_tri, cauhoi_id FROM dethi
UNION ALL
SELECT D AS gia_tri, cauhoi_id FROM dethi
) tmp GROUP BY cauhoi_id, gia_tri ORDER BY cauhoi_id;
Cuối cùng, áp dụng mệnh đề HAVING để lọc ra các bản ghi có giá trị bị lặp lại:
SELECT gia_tri, COUNT(gia_tri) so_lan, cauhoi_id
FROM (
SELECT A AS gia_tri, cauhoi_id FROM dethi
UNION ALL
SELECT B AS gia_tri, cauhoi_id FROM dethi
UNION ALL
SELECT C AS gia_tri, cauhoi_id FROM dethi
UNION ALL
SELECT D AS gia_tri, cauhoi_id FROM dethi
) tmp GROUP BY cauhoi_id, gia_tri HAVING COUNT(gia_tri) > 1 ORDER BY cauhoi_id;
Với kết quả này, bạn có thể dễ dàng xác định những câu hỏi nào có các tùy chọn bị trùng lặp và tiến hành sửa chữa.