2012-09-12 76 views
1

我有幾個版本分配給DocumentID。聲明刪除舊版本的條目

DocID Version 
ABC 1 
ABC 2 
ABC 3 
DEF 1 
DEF 2 

如何刪除舊版本並只保留最新版本?刪除後,本應留在表:

DocID Version 
ABC 3 
DEF 2 
+0

如果是SQL Server,爲什麼它也被標記爲'mysql'?你能指定SQL Server的版本嗎? –

+0

在mysql上輸入錯誤 - SQL Server版本是2012 – TonyC

回答

6

的SQL Server 2005+:

;WITH x AS (SELECT DocID, Version, rn = ROW_NUMBER() OVER 
    (PARTITION BY DocID ORDER BY Version DESC) 
    FROM dbo.tablename 
) 
DELETE x WHERE rn > 1; 

對於SQL Server 2000這是一個有點複雜。 (它總是有用的,包括版本信息。)

DELETE t 
FROM dbo.tablename AS t 
LEFT OUTER JOIN 
(
    SELECT DocID, Version = MAX(Version) 
    FROM dbo.tablename 
    GROUP BY DocID 
) AS t2 
ON t.DocID = t2.DocID 
AND t.Version = t2.Version 
WHERE t2.DocID IS NULL; 

顯然後者的查詢will work in MySQL as well(感謝@bluefeet)。

對於MySQL你是你自己的,你最好發佈一個完全不同的問題。

+0

我相信你的第二個查詢可以在MySql中使用[見sql小提琴](http://sqlfiddle.com/#!2/4055c/1),所以你可以編輯你的答案。 :) – Taryn

+0

謝謝 - 我得到它與第二個版本的工作。 – TonyC

+0

@TonyC在SQL Server 2012上,第一個版本應該更好。你試過了嗎? –