我有两个表 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/