2008-09-05 68 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 
相关问题