我正在尝试编写一个脚本来删除除最顶层之外的所有记录(如果它只是任何一个也没关系,那么只需要留下一条记录)。这是我现在的格式:
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
答案 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
不唯一,这些行为会有所不同。假设最高id
为10
,并且有三行id = 10
。最佳答案将在表格中留下一行;底部答案(和阿德里安的答案)将留下三排。如果这是您的情况,并且即使出现平局,您的意图是在表中只留下一行,您可以在顶部查询中为ORDER BY
添加其他打破平局条件。
答案 2 :(得分:0)
我假设你的桌子上有某种独特的标识符?
为此做这样的事情
delete from [table]
where [uniqueColumn] <> 'value';
如果您没有唯一的列。
手动进入表格,
更改您想要成为独特的行的值,例如“OMGWTFBBQSauce”
然后做
delete from [table]
where [column] <> 'OMGWTFBBQSauce';