Bonjour,
J'ai une table contenant un historique notamment 4 colonnes :
CODE
LIBELLE
DATE_OUVERTURE
DATE_FERMETURE

On doit avoir le libellé d'un CODE donné pour une plage comprise entre DATE_OUVERTURE et DATE_FERMETURE.
J'ai réussi à remplir cette table ainsi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
CODE    libelle      DATE_OUVERTURE	DATE_FERMETURE	
01      lib012007    01/01/2007           NULL
01	 lib012007b   01/05/2007           NULL
01      lib012008    01/01/2008           NULL
 
02      Lib2 2007    01/01/2007           NULL
02      Lib2 2007b   05/06/2007           NULL
 
03      LIB3 2007    01/01/2007           NULL
 
04      LIB3 2007    01/01/2007	         15/03/2008
Et je voudrais trouver les dates de fermetures manquantes, qui sont la date d'ouverture immédiatement supérieure pour le même code.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
CODE    libelle      DATE_OUVERTURE	DATE_FERMETURE	
01      lib012007    01/01/2007           01/05/2007
01	 lib012007b   01/05/2007           01/01/2008
01      lib012008    01/01/2008           NULL
 
02      Lib2 2007    01/01/2007           05/06/2007
02      Lib2 2007b   05/06/2007           NULL
 
03      LIB3 2007    01/01/2007           NULL
 
04      LIB3 2007    01/01/2007	         15/03/2008
Pour l'instant voici ma requête, elle est triangulaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
Update PALIER
SET DATE_FERMETURE=
            (SELECT MIN(F.DATE_OUVERTURE)
            from PALIER F
            where PALIER.CODE=F.CODE
            AND F.DATE_OUVERTURE>PALIER.DATE_OUVERTURE
            )
 
where DATE_FERMETURE is null
AND  EXISTS ( 	SELECT * from PALIER E 
		WHERE E.CODE=PALIER.CODE 
		AND E.DATE_OUVERTURE>PALIER.DATE_OUVERTURE
	    );
le EXISTS sert à ne pas mettre à jour les lignes qui ne changent pas dont la date de fermeture reste à NULL, il est utile car il y a des trigger sur update dans cette table.
Avez vous une autre façon d'écrire cette requête qui soit plus élégante et sans jointure triangulaire?
Ps : la requête doit fonctionner en SQL Server 2000 et 2005

Merci de votre aide
Soazig