我有一个相当大的50000条记录表,我想将其减少到5000.如何编写SQL查询来删除其他45000条记录。基本表结构包含日期时间列。
我想要的查询的大致想法是以下
DELETE FROM mytable WHERE countexceeded(5000) ORDER BY filedate DESC;
我可以用C#编写这个,以某种方式抓住行索引号并做一些解决方法,但有没有一个整洁的方法来做到这一点?
答案 0 :(得分:7)
您接受的答案是无效的语法,因为DELETE
不允许ORDER BY
子句。你可以使用
;WITH T AS
(
SELECT TOP 45000 *
FROM mytable
ORDER BY filedate
)
DELETE FROM T
答案 1 :(得分:1)
DELETE TOP(45000) FROM mytable ORDER BY filedate ASC;
将订单更改为升序以按相反顺序获取行,然后删除前45000.
希望这会有所帮助。
编辑: -
我为无效的语法道歉。这是我的第二次尝试。
DELETE FROM myTable a INNER JOIN
(SELECT TOP(45000) * FROM myTable ORDER BY fileDate ASC) b ON a.id = b.id
如果您没有唯一的专栏,请使用Martin Smith的CTE答案。
答案 2 :(得分:0)
如果表格订购正确:
DELETE FROM mytable LIMIT 5000
如果没有,并且表已正确排序auto_increment index:
获取行
SELECT id, filedate FROM mytable LIMIT 1, 50000;
保存ID然后删除
DELETE FROM mytable WHERE id >= @id;
如果没有正确排序,你可以使用filedate而不是id,但是如果它是没有时间的日期,你可能会从同一天删除不需要的行,所以要小心使用提交删除解决方案