Bonjour,

J'aimerais un complément d'explication sur un truc.

Je plante le décor...

[DECOR]
Il s'agit d'une DB modélisant la gestion de gifts (gift-card et gift-cheque) pour une chaine de magasins.

Le truc c'est que je récupère les données d'une vieille DB sans aucune contrainte ni rien du tout bourrées d'incohérences (d'ailleurs elle n'est faite que d'une table qui n'est même pas en 1NF )
Il a été décidé en concertation avec mon chef de tout importer dans la nouvelle DB (correctement normalisée celle-là) et d'éliminer les incohérences après l'importation.

J'ai donc dans la nouvelle DB une table T_SEND_TO_STORE_STS qui contient les envois de gifts depuis l'entrepôt vers les magasins dont la structure complète importe peu. Les seules colonnes intéressantes sont GFT_ID, STR_ID et STS_DATE.

- GFT_ID étant de type INT (et faisant référence à la clef primaire de la table T_GIFT_GFT) qui est l'identifiant du gift
- STR_ID étant de type INT (et faisant référence à la clef primaire de la table T_STORE_STR) qui est l'identifiant du magasin
- STS_DATE étant de type DATETIME qui est la date de l'envoi du gift vers le magasin

Du coup, après importation des données, je me retrouve avec des gifts ayant été envoyés deux fois de suite vers un magasin. Genre 2 personnes bossaient en même temps sur l'ancienne appli et zou, ça fait 2 envois pour le même gift dans la DB. J'vous raconte pas mon étant quand j'ai découvert ce genre de chose en analysant les données que je devais importer... Quelle horreur ! (il y a même des gifts qui sont détruits 2 fois ! )
[/DECOR]

Bref ! Ce que je souhaite, c'est obtenir l'envoi le plus récent pour un gift et un magasin donné.

J'ai donc la requête suivante (dont je sais que vous n'y verrai pas d'objection) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
WITH T1(GFT_ID, STS_DATE)
AS(
SELECT    
        GFT_ID, MAX(STS_DATE)
FROM
        DBO.T_SEND_TO_STORE_STS
WHERE
        GFT_ID = 1500822
    AND STR_ID = 14
GROUP BY
        GFT_ID
)
SELECT 
        * 
FROM 
        DBO.T_SEND_TO_STORE_STS STS
            INNER JOIN T1 
                ON    STS.GFT_ID = T1.GFT_ID 
                AND STS.STS_DATE = T1.STS_DATE
Cela me donne bien le résultat escompté.

Par contre, je ne comprends pas ce qui m'empêche de faire ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
SELECT    TOP 1
        *
FROM
        DBO.T_SEND_TO_STORE_STS
WHERE
        GFT_ID = 1500822
    AND STR_ID = 14
ORDER BY
        STS_DATE DESC
J'avais déjà évoqué le sujet dans une autre discussion et il y avait une histoire de ne pas mélangé le logique et le physique mais je ne comprends toujours pas...
En triant sur la date de manière descendante et en prenant la première ligne, quel risque y a-t-il ?