2011-09-05 31 views
0

我有一個相當大的50000條記錄表,我想將其削減到5000.我將如何編寫SQL查詢以刪除其他45000條記錄。基本的表結構包含日期時間的列。如何修剪一張表到50000的第5000條記錄

查詢的粗略的想法,我要的是以下

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

我可以在C#寫這在某種程度上抓住了行索引號,做了一些工作解決這個問題,但有一個整潔的方式做到這一點?

回答

7

您接受的答案是無效語法,因爲DELETE不允許有ORDER BY子句。您可以使用

;WITH T AS 
(
SELECT TOP 45000 * 
FROM mytable 
ORDER BY filedate 
) 
DELETE FROM T 
+0

謝謝你。剛剛注意到,今天早上,在出門之前,應該仔細檢查一下。 – wonea

0

如果表正確排序:

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刪除解決方案

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

這不是有效的語法 –

相關問題