2010-11-25 4 views
2

J'utilise une base de données compacte sql (sdf) dans MS SQL 2008. dans la table 'Job', chaque ID a plusieurs tâches. un système ajoute régulièrement des tâches dans la table.supprime les anciens enregistrements et conserve les 10 derniers en format compact

je voudrais garder les 10 derniers enregistrements pour chaque commande identifiant par leur « datecompleted » et supprimer le reste des dossiers

Comment puis-je construire ma requête? échoué à l'aide #temp table et curseur

+0

Les tables temporaires et les curseurs ne sont pas pris en charge dans SQL Compact. Les différences entre SQL Compact et SQL Server sont disponibles ici: http://technet.microsoft.com/en-us/library/bb896140.aspx –

Répondre

0

Eh bien, il est rapide approche de Noël, donc voici mon cadeau pour vous, un script exemple qui illustre ce que je crois qu'il est que vous essayez d'atteindre. Non, je n'ai pas une grande barbe blanche duveteuse ;-)

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

thx pour le cadeau de Noël ... il ne fonctionne pas en édition compacte, mais j'ai trouvé mon chemin à travers – Kiddo

+0

Quel était le problème, CTE? Si oui, il suffit de l'échanger pour une table dérivée. –

0

Que diriez-vous quelque chose comme:

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

C'est supposant que vous utilisez 3.5 parce que SELECT imbriquée est uniquement disponible dans cette version ou plus.

Je n'ai pas bien lu la question. Je soupçonne que quelque chose de plus sur le modèle d'un CTE résoudra le problème, en utilisant une logique similaire. Vous souhaitez créer une requête qui identifie les enregistrements que vous souhaitez conserver comme point de départ.

Using CTE on SQL Server Compact 3.5

+0

L'identifiant n'est pas unique, donc id1 pourrait avoir 30 jobs et id2 pourrait avoir 40 jobs etc. Ainsi, vous interrogez ne garder que les 10 meilleurs enregistrements. mais je voudrais garder 10 emplois pour id1 et 10 emplois pour id2 etc – Kiddo

+1

Mon malentendu. Étant donné que les tables temporaires ne sont pas prises en charge, vous devrez peut-être créer une série de JOINs sur la table Tâches, ou jouer avec des CTE. –

Questions connexes