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 :

Jointure entre 3 tables


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mars 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 119
    Points : 126
    Points
    126
    Par défaut Jointure entre 3 tables
    Bonjour Je patauge un peu avec ma requete SQL
    Voila j ai 3 tables :

    -Vehicule
    -Transport
    -Transport_Vehicule
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *FROM VEHICULE 
        LEFT OUTER JOIN Transport_Vehicule 
        ON Vehicule.Vecleunik=Transport_Vehicule.Vecleunik 
            LEFT OUTER JOIN Transport
            ON Transport.IDTransport= Transport.IDTransport
    Je désire afficher ma liste de véhicules avec les informations sur le dernier transport ( le fichier de liaison est Transport_Vehicule)

    Par contre un véhicule doit appaitre meme si il n'y a pas de transport ! ( d'ou le left outer join)

    En gros je vais avoir des données du fichier Vehicule et transport à afficher.

    Comment faire ?

  2. #2
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 98
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    avant toute chose, une ligne me semble bizarre dans votre code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *FROM VEHICULE 
        LEFT OUTER JOIN Transport_Vehicule 
        ON Vehicule.Vecleunik=Transport_Vehicule.Vecleunik 
            LEFT OUTER JOIN Transport
            ON Transport.IDTransport= Transport.IDTransport
    ne vouliez pas plutot faire ceci?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *FROM VEHICULE 
        LEFT OUTER JOIN Transport_Vehicule 
        ON Vehicule.Vecleunik=Transport_Vehicule.Vecleunik 
            LEFT OUTER JOIN Transport
            ON Vehicule.IDTransport= Transport.IDTransport
    Mais je peux me tromper

    Et j'aime autant éviter les select * mais préciser les colonnes que je veux afficher.

  3. #3
    Membre habitué
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mars 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 119
    Points : 126
    Points
    126
    Par défaut
    En fait il n'y a pas de IDTransport sur le véhicule , car celui ci peut avoir eu plusieurs transports au cours de sa vie

    BOn j ai essayé d'un autre facon

    J ai récupéré les Derniers transport les plus récents par vehicule

    cad que pour un vehicule j'ai l'id le plus récent mais je n'ai pas recup les données du transport (ne sais pas trop comment faire avec un gorupby sur ce coup la)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Select Transport_Vehicule.vecleunik,max(Transport.IDTRANSPORT) 
    From Transport_Vehicule,Transport
    Where Transport_Vehicule.IDTRANSPORT=Transport.IDTRANSPORT
    Group by Transport_Vehicule.vecleunik


    Est il possible de faire un left join entre vehicule et cette sous requete ?

    Ca résoudrai en partie mon problème

    Merci

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Pouvez-vous nous donner la structure de vous tables ?

    Au lieu de faire maints allers retours, ça nous évitera de tatonner sur des choses simples mais essentielles et on vous donnera une réponse plus juste.

  5. #5
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Quelle est la description de vos tables..?

    Ce que je comprend ici c'est que transport_vehicule est une table de jointure (Et non un fichier !) regroupant les ID de véhicules et de transport pour une relation n:m !

    Donc qu'est ce qui vous poses problème ?

    En gros je vais avoir des données du fichier Vehicule et transport à afficher.
    Des tables Vehicule et transport...
    Donc afficher le noms des colonnes dans le SELECT



    [EDIT]: Grillé, Waldar !

  6. #6
    Membre habitué
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mars 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 119
    Points : 126
    Points
    126
    Par défaut
    Désolé j utilise "fichiers" au lieu de "tables" c est l'habitude Windev

    Table Vehicule
    -IdVehicule
    +Autres Rubriques

    Table Transport_Véhicule
    -IdVéhicule
    -IDTransport
    -+ autres rubriques


    Table Transport
    IDTransport
    Date Transport
    +Autres Rubriques


    Exemple de données

    Vehicule

    1
    2
    3


    Transport
    120
    146
    157

    Transport Vehicule
    Id Veh | IDTrans
    1 | 120
    1 | 157
    3 | 146

    Le resultat que je veux obtenir est


    Liste de TOUS les véhicules
    Et afficher les informations du dernier transport correspondant si il y en a un


    Soit

    Resultat

    IDVEH | IDTransport | +Info vehicule | + info transport
    1 | 157 (le 157 est plus récent que le 120)|+Info vehicule | + info transport
    2 | rien |+Info vehicule
    3 | 146 |+Info vehicule | + info transport

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2008
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 20
    Points : 17
    Points
    17
    Par défaut
    Salut,

    essaye peut-être quelque chose 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
    	V.ID_VEHICULE,
    	V.INFO_VEHICULE,
    	T.ID_TRANSPORT,
    	T.INFO_TRANSPORT
    FROM
    	VEHICULE V
    		LEFT OUTER JOIN (
    				SELECT
    					TV.ID_VEHICULE,
    					MAX(TV.ID_TRANSPORT) AS ID_TRANSPORT
    				FROM 
    					TRANSPORT_VEHICULE TV
    				GROUP BY
    					TV.ID_VEHICULE) TMP
    			ON V.ID_VEHICULE = TMP.ID_VEHICULE
    		LEFT OUTER JOIN TRANSPORT T
    			ON T.ID_TRANSPORT = TMP.ID_TRANSPORT
    Quelque chose comme ça ou qui s'y rapproche devrait fonctionner...

    Par contre, pour récupérer le transport le plus récent pour un véhicule, tu es obligé de passer par un max sur l'id?

    @+

  8. #8
    Membre habitué
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mars 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 119
    Points : 126
    Points
    126
    Par défaut
    bah le max de l ID permet de trouver directement le transport le plus récent a partir de "Transport_Véhicule"

    Mais sinon j ai des dates dans le fichier "transport" , je pensais juste que c etait plus pratique de le faire sur l ID ( Apres peu m importe hein !)

    Bon c est presque ca , sauf que je ne recupere pas les véhicules sans transport

  9. #9
    Membre habitué
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mars 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 119
    Points : 126
    Points
    126
    Par défaut
    Pour information je suis sous une base HyperFile ,j'ai bien peur que cette fonction marche en Mysql mais pas sous Hyperfile

    Me confirme tu que la requete est correcte ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    SELECT Vehicule.VECLEUNIK,Vehicule.ETATVO,Vehicule.NumImmat,Vehicule.Marque,Vehicule.Modele,Vehicule.Version,DestSortie,DateStock,DateEntree,DateVente,Transport.NumBT,DateBT,Transport.DateEnlev,Transport.RSTransporteur,Transport.DateLivraison 
    FROM VEHICULE  
    LEFT OUTER JOIN (SELECT TRANSPORT_VEHICULE.VECLEUNIK,	MAX(TRANSPORT_VEHICULE.IDTRANSPORT) AS IDTRANSPORT 
    				FROM TRANSPORT_VEHICULE  GROUP BY TRANSPORT_VEHICULE.VECLEUNIK ) TMP 
    ON VEHICULE.VECLEUNIK= TMP.VECLEUNIK 
    	LEFT OUTER JOIN TRANSPORT 
    	ON TRANSPORT.IDTRANSPORT = TMP.IDTRANSPORT 
    WHERE ENVENTE=1

  10. #10
    Membre habitué
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mars 2002
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2002
    Messages : 119
    Points : 126
    Points
    126
    Par défaut
    Ok cette requete marche sous Mysql , Le probleme viens donc du moteur de la base Hypefile.

    Je vais regarder de ce coté

    Merci bcp !

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

Discussions similaires

  1. PROBLEME DE JOINTURE ENTRE DEUX TABLE
    Par DarkMax dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/01/2005, 15h11
  2. Jointure entre 3 tables
    Par zigune dans le forum Langage SQL
    Réponses: 9
    Dernier message: 15/11/2004, 16h04
  3. Jointure entre deux tables et résultat
    Par Asdorve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2004, 14h50
  4. [jointure]requete possible de double jointure entre 2 tables
    Par akira_le_gaucher dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/05/2004, 15h03
  5. Jointure entre 2 tables et OR
    Par PyRoFlo dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/02/2004, 18h42

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