删除SQL Server中除顶级记录外的所有记录

时间:2012-08-08 17:02:16

标签: sql sql-server sql-server-2005

我正在尝试编写一个脚本来删除除最顶层之外的所有记录(如果它只是任何一个也没关系,那么只需要留下一条记录)。这是我现在的格式:

DELETE FROM table
WHERE id NOT IN (
  SELECT id
  FROM (
    SELECT id
    FROM table
    ORDER BY id DESC
    LIMIT 1 ))

但是我意识到LIMIT不是SQL Server 2005中公认的功能,所以我对于该做什么感到困惑。任何人都有关于这个主题的专业知识?并且这些记录不会重复,我只想取出除一条记录以外的所有记录。

更新:

我意识到我在这里要完成的事情并不完全清楚。我需要做的是删除该表中除了顶部记录之外的所有记录,因为它在另一列中具有相同的值(让我们称之为'anotherid')。

所以就像这样:

id        value       anotherid       
1          3           1
2          4           1
3          5           2
4          6           2
5          7           2

对此:

id        value       anotherid       
1          3           1
3          5           2

3 个答案:

答案 0 :(得分:7)

delete from table where id <> (select top 1 id from table order by id desc)

答案 1 :(得分:2)

鉴于更新,据我所知:

DECLARE @x TABLE(id INT, value INT, anotherid INT);

INSERT @x SELECT 1, 3, 1
UNION ALL SELECT 2, 4, 1
UNION ALL SELECT 3, 5, 2
UNION ALL SELECT 4, 6, 2
UNION ALL SELECT 5, 7, 2;

;WITH y AS 
(
  SELECT id, rn = ROW_NUMBER() OVER 
   (PARTITION BY anotherid ORDER BY id) -- or order by value?
   FROM @x -- replace with your dbo.tablename
)
DELETE y WHERE rn > 1;

SELECT id, value, anotherid FROM @x;

结果:

id  value  anotherid
--- ------ ---------
1   3      1
3   5      2

回答原始问题

其他几个选项:

-- use a CTE to identify the highest id,
-- then delete all rows except that one
;WITH x AS 
(
  SELECT id, rn = ROW_NUMBER() OVER (ORDER BY id DESC) 
  FROM dbo.table
)
DELETE x WHERE rn > 1;

-- use a subquery to get the max, and delete
-- all id values lower than that result
DELETE dbo.table WHERE id < (SELECT MAX(id) FROM dbo.table);

请注意,如果id不唯一,这些行为会有所不同。假设最高id10,并且有三行id = 10。最佳答案将在表格中留下一行;底部答案(和阿德里安的答案)将留下三排。如果这是您的情况,并且即使出现平局,您的意图是在表中只留下一行,您可以在顶部查询中为ORDER BY添加其他打破平局条件。

答案 2 :(得分:0)

我假设你的桌子上有某种独特的标识符?

为此做这样的事情

delete from [table] 
where [uniqueColumn] <> 'value';

如果您没有唯一的列。
手动进入表格,
更改您想要成为独特的行的值,例如“OMGWTFBBQSauce” 然后做

delete from [table] 
where [column] <> 'OMGWTFBBQSauce';