sql - 是否有任何纯 sql 方法可以通过以下方式从日志表中删除数据

标签 sql sql-server database linq

我有两个表 1. main_table 2. log_table 在 main_table 上定义了一个触发器,它在删除和更新时将受影响的行复制到 log_table。在 log_table 中,列是相同的,除了两个额外的列 pid(主键 int)和 updateat(时间戳)。

每个月,cron 作业都会从 log_table 中删除超过 10 天的所有记录。我需要更改以删除除每行的最新 10 条记录之外的所有记录。

我是通过 linq 完成的,我在其中选择了不同的 ID,然后遍历所有 ID 并删除该 ID 的所有数据(前 10 个除外)。 这是有效的,除了它在生产环境中非常缓慢且不切实际。我还尝试将此逻辑移动到带有游标的存储过程,但它仍然很慢。

我不确定,但我认为还有其他方法可以实现它,而无需循环?

如果重要的话,服务器是 mssql 2012。

最佳答案

这是你想要的吗?

with todelete as (
      select l.*,
             row_number() over (partition by id order by updatedate desc) as seqnum
      from log_table l
     )
delete todelete
    where seqnum > 10;

关于sql - 是否有任何纯 sql 方法可以通过以下方式从日志表中删除数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40282817/

相关文章:

sql - 如何在 Postresql 中使用列组和谓词创建约束 'EXCLUDE' 或 'Unique'?

sql - 如何查看SQL存储过程的运行进度?

Javascript nodejs 繁琐的 mssql 有没有办法获取 json?

sql-server - 使用 SSIS 包名称查找代理作业

sql - 批量插入时忽略外键约束

mysql - 服务器之间的数据库传输

MySQL 时区

mysql - 用户花费的平均时间(包括所有登录和注销)

php - MySQL 双表 INNER JOIN,LEFT JOINED 到第三个表,只有一行具有最低值

php - 如何更新其他相关表中的主键/外键?