我有一個相當大的50000條記錄表,我想將其削減到5000.我將如何編寫SQL查詢以刪除其他45000條記錄。基本的表結構包含日期時間的列。如何修剪一張表到50000的第5000條記錄
查詢的粗略的想法,我要的是以下
DELETE FROM mytable WHERE countexceeded(5000) ORDER BY filedate DESC;
我可以在C#寫這在某種程度上抓住了行索引號,做了一些工作解決這個問題,但有一個整潔的方式做到這一點?
我有一個相當大的50000條記錄表,我想將其削減到5000.我將如何編寫SQL查詢以刪除其他45000條記錄。基本的表結構包含日期時間的列。如何修剪一張表到50000的第5000條記錄
查詢的粗略的想法,我要的是以下
DELETE FROM mytable WHERE countexceeded(5000) ORDER BY filedate DESC;
我可以在C#寫這在某種程度上抓住了行索引號,做了一些工作解決這個問題,但有一個整潔的方式做到這一點?
您接受的答案是無效語法,因爲DELETE
不允許有ORDER BY
子句。您可以使用
;WITH T AS
(
SELECT TOP 45000 *
FROM mytable
ORDER BY filedate
)
DELETE FROM T
如果表正確排序:
DELETE FROM mytable LIMIT 5000
如果不和表已經正確排序AUTO_INCREMENT指數:
獲取該行
SELECT id, filedate FROM mytable LIMIT 1, 50000;
保存ID,然後刪除
DELETE FROM mytable WHERE id >= @id;
如果沒有正確排序,你可以使用的FILEDATE而不是ID,但如果它是沒有時間的日期,你可以得到由同日起刪除不需要的行,所以要小心與FILEDATE刪除解決方案
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答案。
這不是有效的語法 –
謝謝你。剛剛注意到,今天早上,在出門之前,應該仔細檢查一下。 – wonea