2012-09-12 3 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

typo on mysql - SQL Server 버전은 2012입니다. – TonyC

답변

6

SQL 서버 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 서버 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 [http://sqlfiddle.com/#!2/4055c/1 참조]에서 작동하므로 답변을 편집 할 수 있습니다. :) – Taryn

+0

감사합니다 - 나는 두 번째 버전과 함께 작동하도록했습니다. – TonyC

+0

@TonyC SQL Server 2012에서는 첫 번째 버전이 훨씬 더 좋습니다. 너 해봤 니? –

관련 문제