IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Correspondance multiple avec sélection de l'entrée la plus récente


Sujet :

Langage SQL

  1. #1
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut Correspondance multiple avec sélection de l'entrée la plus récente
    Bonjour,
    voilà je sollicite votre avis sur une requête SELECT.
    J'ai deux tables AA et BB. Pour simplifier, les colonnes de AA sont AAID (clé primaire), les colonnes de BB sont AAID, BBID (clé primaire), BBDATE, BB.AAID étant une clé étrangère sur AA.AAID.
    Pour un AA.AAID, il peut exister plusieurs enregistrements dans BB avec des BBDATE différents.
    Je souhaite par une requête récupérer l'ensemble des AA.AAID tels que pour chacun la date la plus récente correspondante dans la table BB soit comprise entre deux dates données, j'ai fait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT AA.AAID
    FROM AA, BB
    WHERE
    AA.AAID = BB.AAID AND
    BB.BBDATE =
      (SELECT MAX(B.BBDATE)
       FROM BB B
       WHERE BB.AAID = B.AAID) AND
    BB.BBDATE >= TO_DATE(...) AND
    BB.BBDATE <= TO_DATE(...)
    Votre avis ? est-ce optimal ?
    Merci d'avance !

  2. #2
    Membre éclairé Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 672
    Points : 781
    Points
    781
    Par défaut
    Hello,

    Je dirais, mais sans avoir testé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT AA.AAID,MAX(BB.AAID)
    FROM AA JOIN BB ON (AA.AAID = BB.AAID) 
    WHERE BB.BBDATE >= TO_DATE(...) 
    AND BB.BBDATE <= TO_DATE(...)
    GOUP BY AA.AAID
    ++

  3. #3
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Merci pour ta réponse.
    Je suppose que tu voulais dire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT AA.AAID,MAX(BB.BBDATE)
    ?
    J'y ai pensé mais en fait ça ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    BBID BBDATE
    ---------------
    1    01/01/2006
    2    01/02/2006
    3    01/03/2006
    Si l'intervalle de date est 01/01/2006-02/01/2006, ta requête renvoie la ligne 1, alors que ce n'est pas la date la plus récente : il ne devrait y avoir aucune ligne retournée.

  4. #4
    Membre éclairé Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 672
    Points : 781
    Points
    781
    Par défaut
    Citation Envoyé par herve91
    Je suppose que tu voulais dire :
    oui copier/coller un peu trop rapide

    Citation Envoyé par herve91
    Si l'intervalle de date est 01/01/2006-02/01/2006, ta requête renvoie la ligne 1, alors que ce n'est pas la date la plus récente : il ne devrait y avoir aucune ligne retournée.
    J'avais mal compris ta requete
    Par contre, à moins que je soit vraiment super fatigué, si j'ai bien compris cette fois :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT B1.AAID, B1.BBDATE
    FROM BB B1
    WHERE B1.BBDATE >= TO_DATE(...) 
    AND B1.BBDATE <= TO_DATE(...)
    B1.BBDATE =
      (SELECT MAX(B2.BBDATE)
       FROM BB B2
       WHERE B2.AAID = B1.AAID)

    Ca te permet d'eviter d'utiliser la table AA. Mais sinon, je ne vois pas ...

    ++

  5. #5
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Points : 960
    Points
    960
    Par défaut
    Bonjour, je dirais plutot.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT AA.AAID,MAX(BB.BBDATE)
    FROM AA JOIN BB ON (AA.AAID = BB.AAID) 
    GOUP BY AA.AAID
    having MAX(BB.BBDATE between date and date2
    Cordialement
    Pinocchio

  6. #6
    Membre éclairé Avatar de Spoutnik
    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 672
    Points : 781
    Points
    781
    Par défaut
    Hello,

    +1, mais dans ce cas, autant faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT BB.AAID,MAX(BB.BBDATE)
    FROM BB 
    GOUP BY BB.AAID
    HAVING MAX(BB.BBDATE BETWEEN date AND date2
    nan ?

  7. #7
    Membre éprouvé Avatar de pinocchio
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2002
    Messages
    795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2002
    Messages : 795
    Points : 960
    Points
    960
    Par défaut
    Citation Envoyé par Spoutnik
    Hello,

    +1, mais dans ce cas, autant faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT BB.AAID,MAX(BB.BBDATE)
    FROM BB 
    GOUP BY BB.AAID
    HAVING MAX(BB.BBDATE BETWEEN date AND date2
    nan ?
    Oui mauvais copier/coller de départ

  8. #8
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Ok, merci pour vos réponses !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2013] Créer une rechercheV avec correspondances multiples
    Par Waldstein dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/04/2014, 09h25
  2. Fenêtres multiples avec la librairie SDL
    Par pierrev1 dans le forum SDL
    Réponses: 4
    Dernier message: 10/12/2006, 11h36
  3. [Excel] Selection multiple avec critères
    Par tibotibotibo dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/04/2005, 10h48
  4. INSERT multiples avec : rs.AddNew et .Update
    Par M.Zip dans le forum ASP
    Réponses: 4
    Dernier message: 03/12/2004, 15h53
  5. Créer un état à source de données multiples avec Delphi5
    Par khenri2 dans le forum Bases de données
    Réponses: 7
    Dernier message: 23/10/2004, 22h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo