如何将表修剪为50000的前5000条记录

时间:2011-09-05 15:01:50

标签: tsql

我有一个相当大的50000条记录表,我想将其减少到5000.如何编写SQL查询来删除其他45000条记录。基本表结构包含日期时间列。

我想要的查询的大致想法是以下

DELETE FROM mytable WHERE countexceeded(5000) ORDER BY filedate DESC;

我可以用C#编写这个,以某种方式抓住行索引号并做一些解决方法,但有没有一个整洁的方法来做到这一点?

3 个答案:

答案 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,但是如果它是没有时间的日期,你可能会从同一天删除不需要的行,所以要小心使用提交删除解决方案