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 :

Amélioration d'une requête


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 9
    Points
    9
    Par défaut Amélioration d'une requête
    Bonjour,

    Je vous livre tel quel mon problème :

    Voici ma base de données constituée de 3 tables :
    TABLE : PRENOM
    ID | NOM
    --------------------
    1 | Paul
    2 | Pierre
    3 | Patrice
    4 | Philippe

    TABLE : ACHAT
    ID | ADAT | TYPE
    -------------------------
    1 | 01/05/2005 | MICRO
    1 | 25/12/2005 | MOTO
    2 | 03/05/2004 | MAISON
    2 | 20/04/2005 | AUTO
    2 | 26/10/2005 | MOTO
    2 | 12/12/2005 | APPART
    3 | 30/03/2004 | MICRO
    3 | 19/06/2004 | MOTO
    3 | 21/01/2005 | AUTO
    3 | 16/04/2005 | MAISON
    3 | 23/07/2005 | BATEAU
    4 | 11/09/2004 | AUTO

    TABLE : VOYAGE
    ID | VDAT | LOCAL
    --------------------------
    1 | 21/01/2005 | EUROPE
    1 | 23/07/2005 | ASIE
    1 | 20/04/2005 | AMERIQUE
    2 | 30/03/2004 | AFRIQUE
    2 | 11/09/2004 | OCEANIE
    3 | 03/05/2004 | ASIE
    3 | 01/05/2005 | AFRIQUE
    3 | 16/04/2005 | ASIE
    4 | 25/12/2005 | ASIE
    4 | 19/06/2004 | EUROPE
    4 | 26/10/2005 | ASIE
    4 | 12/12/2005 | EUROPE

    Ma requête SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT PRENOM.ID, PRENOM.NOM, ACHAT.ADAT, ACHAT.TYPE, MAX(VOYAGE.VDAT) AS MVDAT, VOYAGE.LOCAL
    FROM PRENOM
    LEFT OUTER JOIN ACHAT   ON PRENOM.ID = ACHAT.ID
    LEFT OUTER JOIN VOYAGE  ON PRENOM.ID = VOYAGE.ID
    WHERE (VOYAGE.LOCAL = 'ASIE') OR (ACHAT.TYPE = 'MOTO' OR ACHAT.TYPE = 'MAISON')
    GROUP BY PRENOM.ID, PRENOM.NOM, ACHAT.ADAT, ACHAT.TYPE, VOYAGE.LOCAL
    ORDER BY PRENOM.ID
    La réponse de la requête SQL (réponse intermédiaire)
    N° | NOM | DATE | TYPE | DATE | LOCAL
    -----------------------------------------------------------
    01 | Paul | 01/05/2005 | MICRO | 23/07/2005 | ASIE
    02 | Paul | 25/12/2005 | MOTO | 20/04/2005 | AMERIQUE
    03 | Paul | 25/12/2005 | MOTO | 23/07/2005 | ASIE
    04 | Paul | 25/12/2005 | MOTO | 21/01/2005 | EUROPE
    05 | Pierre | 03/05/2004 | MAISON | 30/03/2004 | AFRIQUE
    06 | Pierre | 03/05/2004 | MAISON | 11/09/2004 | OCEANIE
    07 | Pierre | 26/10/2005 | MOTO | 30/03/2004 | AFRIQUE
    08 | Pierre | 26/10/2005 | MOTO | 11/09/2004 | OCEANIE
    09 | Patrice| 30/03/2004 | MICRO | 16/04/2005 | ASIE
    10 | Patrice| 19/06/2004 | MOTO | 01/05/2005 | AFRIQUE
    11 | Patrice| 19/06/2004 | MOTO | 16/04/2005 | ASIE
    12 | Patrice| 21/01/2005 | AUTO | 16/04/2005 | ASIE
    13 | Patrice| 16/04/2005| MAISON | 01/05/2005 | AFRIQUE
    14 | Patrice| 16/04/2005| MAISON | 16/04/2005 | ASIE
    15 | Patrice| 23/07/2005| BATEAU | 16/04/2005 | ASIE
    16 | Philippe| 11/09/2004| AUTO | 25/12/2005 | ASIE

    Enfin j'utilise un script ASP pour obtenir cette réponse finale :
    N° | NOM | DATE | TYPE | DATE | LOCAL
    ---------------------------------------------------------
    03 | Paul | 25/12/2005 | MOTO | 23/07/2005 | ASIE
    05 | Pierre | 03/05/2004 | MAISON | -------- |---------
    07 | Pierre | 26/10/2005 | MOTO | --------- |---------
    11 | Patrice | 19/06/2004 | MOTO | 03/05/2004 | ASIE
    14 | Patrice | 16/04/2005 | MAISON | 03/05/2004 | ASIE
    16 | Philippe | ---------- | ------- | 25/12/2005 | ASIE

    Cette liste répond à la question
    - à quelles dates ont été achetées MOTO et MAISON et
    - la dernière date du voyage en ASIE
    pour toutes les personnes de ma table PRENOM

    Ma question :

    Est-il possible d'améliorer ma requête SQL pour qu'elle me retourne directement la réponse finale (je pourrais ainsi me passer du script ASP)

    Merci

  2. #2
    Nouveau membre du Club
    Inscrit en
    Février 2005
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 31
    Points : 37
    Points
    37
    Par défaut
    pourquoi ne pas essayer avec des sous-requetes:
    SELECT PRENOM.ID, PRENOM.NOM, ( select ACHAT.ADAT where ACHAT.TYPE = "moto" and RENOM.ID = ACHAT.ID ) as achatmoto,( select ACHAT.ADAT where ACHAT.TYPE = "moto" and PRENOM.ID = ACHAT.ID ) as achatmaison , select MAX(VOYAGE.VDAT) where PRENOM.ID = VOYAGE.ID and (VOYAGE.LOCAL = 'ASIE') AS MVDAT
    FROM PRENOM
    ORDER BY PRENOM.ID

  3. #3
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    Bonjour,

    essaies-comme ça
    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
    SELECT	prenom.id,
    	prenom.nom,
    	achat.adat,
    	achat.type,
    	MAX(voyage.vdat) AS mvdat, 
    	voyage.local
    FROM 	prenom
    LEFT OUTER JOIN achat  
    ON 	prenom.id = achat.id
    AND	achat.type IN ('MOTO',  'MAISON')
    LEFT OUTER JOIN voyage  
    ON 	prenom.id = voyage.id
    AND	voyage.local = 'ASIE'
    GROUP BY prenom.id, 
    	prenom.nom, 
    	achat.adat, 
    	achat.type, 
    	voyage.local
    ORDER BY prenom.id

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Merci kashue, TheLeadingEdge pour vos réponses diligentes !
    Ces deux requêtes ('Select' imbriqués et jointures conditionnelles) m'ouvrent de nouvelles pistes... Je vais travailler la-dessus.
    Encore merci !

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

Discussions similaires

  1. [2012] Aide à l'amélioration d'une requête
    Par MRzaa dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 30/03/2014, 12h08
  2. Amélioration d'une requête
    Par Jefty dans le forum Langage SQL
    Réponses: 13
    Dernier message: 09/06/2012, 15h22
  3. Amélioration d'une requête
    Par Redg9 dans le forum Requêtes
    Réponses: 8
    Dernier message: 29/07/2009, 11h18
  4. cherche aide pour améliorer le traitement d'une requête
    Par nomade333 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 22/04/2008, 14h15
  5. améliorer une requête
    Par papilou86 dans le forum Access
    Réponses: 5
    Dernier message: 22/05/2006, 11h40

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