2008-09-05 72 views

回答

61
DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table) 

編輯:

克里斯帶來了良好的業績創下自TOP 10的查詢將針對每行運行。如果這是一次性事情,那麼它可能不是什麼大不了的事情,但如果這是一件普通的事情,那麼我就仔細觀察它。

+3

如果有人通常需要刪除除前n行之外的所有行,我認爲他們有更大的問題需要擔心。 – 2009-02-03 22:17:53

+4

只需要注意,您可以通過手動創建臨時表來解決子查詢性能問題(假設這是一個不頻繁的操作),或者將查詢寫爲`DELETE FROM TABLE WHERE ID NOT IN(SELECT id FROM(SELECT TOP 10 ID FROM表)AS x)`強制MySQL創建一個臨時表。 – 2011-07-19 16:46:39

+0

謝謝。這是一個生活救星:) – Si8 2014-04-21 14:44:54

2

我不知道其他的味道,但MySQL的DELETE允許極限。

如果你可以訂購的東西,讓你想保持n行是在底部,那麼你可以做一個DELETE FROM表限制TableCount的-N。

編輯

嗚。我認爲我更喜歡Cory Foy's答案,假設它適用於你的情況。相比之下,我的方式感覺有點笨拙。

0

我會解決它使用下面的技術。該示例預計在每行上有條款表,其中id

Delete article where id not in (select top 1000 id from article) 

編輯:太慢了,回答我的問題...

29

我會選擇ID列(S)的一組要保持到一個臨時表或表變量行。然後刪除臨時表中不存在的所有行。其他用戶提到的語法:

DELETE FROM Table WHERE ID NOT IN (SELECT TOP 10 ID FROM Table) 

存在潛在的問題。 「SELECT TOP 10」查詢將針對表中的每一行執行,這可能會造成巨大的性能下降。你想避免一遍又一遍地做同樣的查詢。

這句法應該工作,根據你你原來的SQL語句中列出:

create table #nuke(NukeID int) 

insert into #nuke(Nuke) select top 1000 id from article 

delete article where not exists (select 1 from nuke where Nukeid = id) 

drop table #nuke 
0

重構?

Delete a From Table a Inner Join (
    Select Top (Select Count(tableID) From Table) - 10) 
     From Table Order By tableID Desc 
) b On b.tableID = A.tableID 

編輯:嘗試他們無論是在查詢分析器,目前的答案是禁食(由...該死的順序)

0

更好的方式是插入你想進入另一個表中的行,刪除原始表格,然後重命名新表格,使其與舊錶格名稱相同

6

未使用MS SQL的用戶的未來參考。

在PostgreSQL中使用ORDER BYLIMIT而不是TOP

DELETE FROM table 
WHERE id NOT IN (SELECT id FROM table ORDER BY id LIMIT n); 

MySQL - well ...

錯誤 - 該版本的MySQL還不支持 'LIMIT & IN/ALL/ANY/SOME子查詢'

尚未我猜。

1

這真的是語言特定的,但我可能會使用類似下面的SQL服務器。

declare @n int 
SET @n = SELECT Count(*) FROM dTABLE; 
DELETE TOP (@n - 10) FROM dTable 

,如果你不關心行的確切數目,總有

DELETE TOP 90 PERCENT FROM dTABLE; 
2

我想用一個虛擬表會比一個IN子句或臨時表好得多。

DELETE 
    Product 
FROM 
    Product 
    LEFT OUTER JOIN 
    (
     SELECT TOP 10 
      Product.id 
     FROM 
      Product 
    ) TopProducts ON Product.id = TopProducts.id 
WHERE 
    TopProducts.id IS NULL 
相關問題