나는 MS SQL 2008에서 SQL 압축 데이터베이스 (sdf)를 사용하고 있습니다. '작업'테이블에서 각 ID는 여러 작업이 있습니다. 시스템에 정기적으로 작업이 테이블에 추가됩니다.오래된 레코드를 삭제하고 SQL 최신 10 유지 최신
나는 '을 datecompleted'자신에 의해 각 ID 순서의 10 개 최신 기록을 유지하고 기록 난 내 쿼리를 구성 할 수있는 방법의 나머지 부분을 삭제하려면
? 같은 대해 테이블 커서
나는 MS SQL 2008에서 SQL 압축 데이터베이스 (sdf)를 사용하고 있습니다. '작업'테이블에서 각 ID는 여러 작업이 있습니다. 시스템에 정기적으로 작업이 테이블에 추가됩니다.오래된 레코드를 삭제하고 SQL 최신 10 유지 최신
나는 '을 datecompleted'자신에 의해 각 ID 순서의 10 개 최신 기록을 유지하고 기록 난 내 쿼리를 구성 할 수있는 방법의 나머지 부분을 삭제하려면
? 같은 대해 테이블 커서
음이 빠른 그래서 여기에 크리스마스를 접근하면 내 선물, 나는 그것이 당신이 달성하려고하는 것입니다 믿는 것을 설명하는 예제 스크립트입니다. 큰 흰 솜털 수염이 없습니다.
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;
xmas 선물용 thx ... 소형 버전에서는 작동하지 않지만 그걸 통해 내 방식을 찾았습니다 – Kiddo
CTE는 무엇이 문제였습니까? 그렇다면 그냥 파생 된 테이블을 위해 그것을 밖으로 바꿔라. –
어떻게 #temp 사용하여 실패
DELETE FROM
Job
WHERE NOT
id IN (
SELECT TOP 10 id
FROM Job
ORDER BY datecompleted)
이 중첩 SELECT이 버전 이상에서만 사용할 수 있기 때문에 당신이 3.5를 사용하는 가정입니다.
질문을 올바르게 읽지 못했습니다. 비슷한 논리를 사용하여 CTE 라인을 따라 더 많은 문제가 해결 될 것으로 판단됩니다. 시작점으로 보관할 레코드를 식별하는 쿼리를 작성하려고합니다.
id가 고유하지 않으므로 id1에 30 개의 작업이 있고 id2에 40 개의 작업이 포함될 수 있습니다. 등등 그래서 쿼리는 상위 10 개 레코드 만 유지합니다. 하지만 id1에 10 개의 일자리를, id2에 10 개의 일자리를 계속하고 싶습니다. – Kiddo
오해. 임시 테이블은 지원되지 않으므로 작업 테이블에서 일련의 JOIN을 자체적으로 수행하거나 CTE와 함께 플레이해야 할 수 있습니다. –
임시 테이블과 커서는 SQL Compact에서 지원되지 않습니다. SQL Compact와 SQL Server의 차이점은 다음과 같습니다. http://technet.microsoft.com/en-us/library/bb896140.aspx –