2

我正在尝试编写一个脚本来删除除最上面的记录之外的所有记录(如果它只是任何一个也可以,那么只剩下一条记录)。这是我现在的格式:

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
4

3 回答 3

8
delete from table where id <> (select top 1 id from table order by id desc)
于 2012-08-08T17:03:39.160 回答
3

鉴于更新,据我了解:

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不是唯一的,它们的行为会有所不同。假设最高id的是10,并且有 3 行id = 10。最佳答案将在表格中留下一行;底部的答案(和阿德里安的答案)将留下三行。如果这是您的方案,并且您的意图是即使在出现平局的情况下也只在表中保留一行,您可以ORDER BY在顶部查询中添加额外的平局打破条件。

于 2012-08-08T17:07:23.843 回答
1

我假设您的桌子上有某种唯一标识符?

为此做这样的事情

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

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

delete from [table] 
where [column] <> 'OMGWTFBBQSauce';
于 2012-08-08T17:06:51.057 回答