2012-08-08 58 views
2

我想編寫一個腳本來刪除,除了最上面的一個所有記錄(如果它只是任意一個也沒關係,還有一樣要左一個記錄)。下面是我以現在的格式:刪除所有,但上面記錄在SQL服務器

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

但我意識到,限制是不是在SQL Server 2005中識別的功能,所以我有點卡住,以什麼做的。任何人都有關於此主題的專業知識?而這些記錄並不重複,我只想取出除一個記錄以外的所有記錄。

UPDATE:

我意識到什麼,我想在這裏實現並不完全清楚。我需要做的是刪除除表中頂部記錄以外的所有記錄,因爲它在另一列中具有相同的值(我們稱之爲'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

排序是否巧合?您選擇id 1,因爲anotherid = 1的id最低?或者因爲anotherid = 1的值最低?還是其他原因? – 2012-08-08 18:49:04

+0

這是巧合的,anotherid不是唯一的,我只是想要它只會在桌面上留下一個anotherid記錄的一個實例 – user974047 2012-08-08 18:51:17

+0

因此,只要只有一個,您不關心anotherid = 1的哪一行仍然存在? – 2012-08-08 18:53:24

回答

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添加額外的平局標準。

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

這工作,非常感謝你! – user974047 2012-08-08 17:05:37

+0

很高興幫助。不要忘記接受最能幫助你的答案。 – 2012-08-08 17:09:26

0

我假設有某種獨特的標識符在你的桌子嗎?

對於做這樣的事情

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

如果沒有唯一列。
手動去到表中,
你想成爲唯一像「OMGWTFBBQSauce」的東西的行改變的值。
然後做

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