2010-11-25 3 views
2

나는 MS SQL 2008에서 SQL 압축 데이터베이스 (sdf)를 사용하고 있습니다. '작업'테이블에서 각 ID는 여러 작업이 있습니다. 시스템에 정기적으로 작업이 테이블에 추가됩니다.오래된 레코드를 삭제하고 SQL 최신 10 유지 최신

나는 '을 datecompleted'자신에 의해 각 ID 순서의 10 개 최신 기록을 유지하고 기록

난 내 쿼리를 구성 할 수있는 방법

의 나머지 부분을 삭제하려면

? 같은 대해 테이블 ​​커서

+0

임시 테이블과 커서는 SQL Compact에서 지원되지 않습니다. SQL Compact와 SQL Server의 차이점은 다음과 같습니다. http://technet.microsoft.com/en-us/library/bb896140.aspx –

답변

0

음이 빠른 그래서 여기에 크리스마스를 접근하면 내 선물, 나는 그것이 당신이 달성하려고하는 것입니다 믿는 것을 설명하는 예제 스크립트입니다. 큰 흰 솜털 수염이 없습니다.

CREATE TABLE TestJobSetTable 
(
    ID INT IDENTITY(1,1) not null PRIMARY KEY, 
    JobID INT not null, 
    DateCompleted DATETIME not null 
); 

--Create some test data 
DECLARE @iX INT; 
SET @iX = 0 
WHILE(@iX < 15) 
BEGIN 
    INSERT INTO TestJobSetTable(JobID,DateCompleted) VALUES(1,getDate()) 
    INSERT INTO TestJobSetTable(JobID,DateCompleted) VALUES(34,getDate()) 
    SET @iX = @iX + 1; 
     WAITFOR DELAY '00:00:0:01' 
END 
--Create some more test data, for when there may be job groups with less than 10 records. 
SET @iX = 0 
WHILE(@iX < 6) 
BEGIN 
    INSERT INTO TestJobSetTable(JobID,DateCompleted) VALUES(23,getDate()) 
    SET @iX = @iX + 1; 
     WAITFOR DELAY '00:00:0:01' 
END 

--Review the data set 
SELECT * FROM TestJobSetTable; 


--Apply the deletion to the remainder of the data set. 
WITH TenMostRecentCompletedJobs AS 
(

    SELECT ID, JobID, DateCompleted 
    FROM TestJobSetTable A 
    WHERE ID in 
    ( 
     SELECT TOP 10 ID 
     FROM TestJobSetTable 
     WHERE JobID = A.JobID 
     ORDER BY DateCompleted DESC 
    ) 
) 
--SELECT * FROM TenMostRecentCompletedJobs ORDER BY JobID,DateCompleted desc; 
DELETE FROM TestJobSetTable 
WHERE ID NOT IN(SELECT ID FROM TenMostRecentCompletedJobs) 

--Now only data of interest remains 
SELECT * FROM TestJobSetTable 

DROP TABLE TestJobSetTable; 
+0

xmas 선물용 thx ... 소형 버전에서는 작동하지 않지만 그걸 통해 내 방식을 찾았습니다 – Kiddo

+0

CTE는 무엇이 문제였습니까? 그렇다면 그냥 파생 된 테이블을 위해 그것을 밖으로 바꿔라. –

0

어떻게 #temp 사용하여 실패

DELETE FROM 
    Job 
WHERE NOT 
    id IN (
     SELECT TOP 10 id 
     FROM Job 
     ORDER BY datecompleted) 

이 중첩 SELECT이 버전 이상에서만 사용할 수 있기 때문에 당신이 3.5를 사용하는 가정입니다.

질문을 올바르게 읽지 못했습니다. 비슷한 논리를 사용하여 CTE 라인을 따라 더 많은 문제가 해결 될 것으로 판단됩니다. 시작점으로 보관할 레코드를 식별하는 쿼리를 작성하려고합니다.

Using CTE on SQL Server Compact 3.5

+0

id가 고유하지 않으므로 id1에 30 개의 작업이 있고 id2에 40 개의 작업이 포함될 수 있습니다. 등등 그래서 쿼리는 상위 10 개 레코드 만 유지합니다. 하지만 id1에 10 개의 일자리를, id2에 10 개의 일자리를 계속하고 싶습니다. – Kiddo

+1

오해. 임시 테이블은 지원되지 않으므로 작업 테이블에서 일련의 JOIN을 자체적으로 수행하거나 CTE와 함께 플레이해야 할 수 있습니다. –

관련 문제