Câu hỏi phỏng vấn T-SQL
Câu hỏi

Làm thế nào bạn có thể xóa các bản ghi trùng lặp trong một bảng không có khóa chính?

Câu trả lời

Để xóa các bản ghi trùng lặp trong một bảng không có khóa chính trong SQL Server, bạn có thể sử dụng một số phương pháp khác nhau. Dưới đây là một số cách tiếp cận:

  1. Sử dụng ROWCOUNT: Bạn có thể thiết lập ROWCOUNT để giới hạn số lượng bản ghi bị ảnh hưởng bởi một lệnh. Đặt ROWCOUNT bằng 1 sẽ cho phép bạn xóa chỉ một trong số các bản ghi trùng lặp.

  2. Sử dụng Common Table Expressions (CTE) và ROW_NUMBER(): Bạn có thể tạo một CTE với ROW_NUMBER() để gán một số thứ tự cho mỗi bản ghi dựa trên các trường bạn muốn xác định sự trùng lặp. Sau đó, bạn có thể xóa các bản ghi có số thứ tự lớn hơn 1.

  3. Sử dụng %%lockres%%: Phương pháp này sử dụng %%lockres%% để xác định duy nhất các bản ghi và sau đó xóa các bản ghi trùng lặp dựa trên điều kiện này.

  4. Sử dụng GROUP BY và HAVING: Bạn có thể sử dụng GROUP BY cùng với HAVING để tìm các bản ghi trùng lặp và sau đó xóa chúng bằng cách sử dụng một subquery.

  5. Thêm một cột tạm thời: Một cách khác là thêm một cột tạm thời với giá trị tự tăng (autoincrement) và sau đó xóa các bản ghi dựa trên cột này.

  6. Di chuyển bản ghi duy nhất sang bảng tạm thời: Bạn có thể tạo một bảng tạm thời, chép các bản ghi duy nhất vào đó và sau đó thay thế bảng gốc bằng bảng tạm thời này.

  7. Xóa cả hai bản ghi và sau đó chèn lại một bản ghi: Trong trường hợp bạn muốn xóa tất cả các bản ghi trùng lặp và chỉ giữ lại một, bạn có thể xóa cả hai và sau đó chèn lại một bản ghi.

Lưu ý rằng trước khi thực hiện bất kỳ thao tác xóa nào, bạn nên sao lưu dữ liệu để tránh mất mát không mong muốn.

Citations:
https://www.mssqltips.com/sqlservertip/1103/delete-duplicate...

middle

middle

Gợi ý câu hỏi phỏng vấn

expert

Những phương pháp tốt nhất khi sử dụng GUID làm khóa chính, cụ thể liên quan đến hiệu suất là gì?

junior

Những lệnh xử lý lỗi mới nào được giới thiệu với SQL Server 2005 và các phiên bản sau?

senior

TRUNCATEDELETE ảnh hưởng đến Identity như thế nào?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào