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

Truy vấn SQL - Xóa các bản sao nếu nhiều hơn 3 lỗi?

with cte as (
  select row_number() over (partition by dupcol1, dupcol2 order by ID) as rn
     from table)
delete from cte
   where rn > 2; -- or >3 etc

Truy vấn đang tạo ra một 'số hàng' cho mỗi bản ghi, được nhóm theo (Dupcol1, Dupcol2) và được sắp xếp theo ID. Trên thực tế, số hàng này đếm 'các bản sao' có cùng conccol1 và Dupcol2 và gán sau đó số 1, 2, 3 .. N, thứ tự theo ID. Nếu bạn chỉ muốn giữ lại 2 'bản sao', thì bạn cần xóa những 'bản sao' đã được gán các số 3,4,.. N và đó là phần được chăm sóc bởi DELLETE.. WHERE rn > 2;

Sử dụng phương pháp này, bạn có thể thay đổi ORDER BY để phù hợp với đơn đặt hàng ưa thích của bạn (ví dụ:ORDER BY ID DESC ), để LATESTrn=1 , thì giá trị mới nhất tiếp theo là rn =2, v.v. Phần còn lại giữ nguyên, DELETE sẽ chỉ loại bỏ những hàng cũ nhất vì chúng có số hàng cao nhất.

Không giống như câu hỏi có liên quan chặt chẽ này , khi điều kiện trở nên phức tạp hơn, việc sử dụng CTE và row_number () trở nên đơn giản hơn. Hiệu suất vẫn có thể có vấn đề nếu không tồn tại chỉ mục truy cập thích hợp.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. T-SQL:Đối lập với nối chuỗi - cách tách chuỗi thành nhiều bản ghi

  2. Trong tsql, một câu lệnh Chèn với một câu lệnh Chọn có an toàn về mặt đồng thời không?

  3. Đối với Nvarchar (Max), tôi chỉ nhận được 4000 ký tự trong TSQL?

  4. Cập nhật cột đếm từ dữ liệu trong bảng khác

  5. Truy xuất hình ảnh từ SQL Server 2008 và xử lý nó trong bộ điều khiển hình ảnh của asp.net