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 :

Comment sortir deux informations liées à une table


Sujet :

Langage SQL

  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 28
    Par défaut Comment sortir deux informations liées à une table
    Bonjour,
    Aujourd'hui, je vous propose un joli petit problème !
    J'ai 3 tables simples, une de membres M (ID, nom, prénom, adresse, etc...), une de véhicules V (ID, identification, kilométrage, etc...) et une de réservations R (ID, conducteur, vehicule, DateResa) de ces véhicules par les membres.

    Ma chaine SQL suivante m'affiche bien ce que je veux, soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    	SELECT R.ID, R.DateResa, R.conducteur, V.identification, M.nom, M.prenom
    	FROM tblReservations R, tblMembres M, tblVehicules V
    	WHERE R.DateResa = NOW()
    	AND R.conducteur = M.ID AND R.vehicule = V.ID
    	ORDER BY R.DateResa
    4322, "03.05.2012", 7, "Voiture1", "MUSTER", "Beat"

    Maintenant, dans ma table de réservations R, j'ajoute un remplaçant du conducteur.
    Ma question est: comment afficher en plus le nom et prenom du remplaçant en une fois, c'est-à-dire que le résultat doit être le suivant:

    4323, "03.05.2012", 7, "Voiture1", "MUSTER", "Beat", 8, "NomRemplaçant", "PrénomRemplaçant" (dans le cas ou R.remplacant != 0)
    4324, "03.05.2012", 7, "Voiture1", "MUSTER", "Beat", 0, "", "" (dans le cas ou R.remplacant == 0)

    Je précise que je suis sous MSAccess mais par ODBC (pas de licence Microsoft Database).
    Merci pour votre aide !

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Commençons par récrire la requête avec une syntaxe plus normalisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT R.ID, R.DateResa, R.conducteur, V.identification, M.nom, M.prenom
    FROM tblReservations R
    INNER JOIN tblMembres M ON R.conducteur = M.ID
    INNER JOIN tblVehicules V ON R.vehicule = V.ID
    WHERE R.DateResa = CURRENT_DATE
    ORDER BY R.DateResa
    Comment sait-on quel est le conducteur principal et le conducteur remplçant ? Rien ne permet de les distinguer dans la table des réservations.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Comment sait-on quel est le conducteur principal et le conducteur remplçant ? Rien ne permet de les distinguer dans la table des réservations.
    Le remplaçant à un ID supérieur au conducteur principal ?
    Mais même si c'est le cas, niveau "requêtage" ce n'est pas pratique

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 28
    Par défaut
    Merci déjà pour vos réponses.
    Le conducteur principal R.conducteur est toujours défini ( != 0 ) dans la table de réservations.
    Par contre, le remplaçant R.remplaçant (que j'avais effectivement oublié de décrire) peut être égal à zéro s'il n'est pas défini par le client ou si défini, est toujours différent du conducteur.
    Mais comme l'information M.nom, M.prénom provient de la même table tblMembres, cette clause me bloque pour la suite du SQL...
    En espérant que je me suis bien expliqué, merci.
    PS: Le remplaçant n'a PAS un ID supérieur au conducteur principal, cela peut être n'importe quel membre de la table tblMembres.

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Et bien il faut faire une seconde jointure, cette fois externe, sur la table des Membres pour récupérer le nom et le prénom du remplaçant.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 28
    Par défaut
    Merci CinePhil, mais... ça ne fonctionne pas !
    Acces n'accepte pas la syntaxe plus normalisée telle que décrite, il me retourne:

    Erreur de syntaxe (opérateur absent) dans l'expression 'R.Conducteur = M.ID INNER JOIN tblVehicules V ON R.Vehicule = V.ID'.

    Un seul INNER JOIN fonctionne (testé avec les 2 séparément = OK).
    Alors, manque-t-il des parenthèses ou Access n'accepte pas cette syntaxe ?

    Ensuite, comment faire justement cette seconde jointure, et pourquoi "externe" ?

  7. #7
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Si tu travailles avec Access, essaie de faire la requête en mode graphique.

    De mémoire, vu que ça fait des années que je n'ai plus touché à Access, il faut importer deux fois la table dans le schéma, ce qui fait que la deuxième instance s'appelle nom_de_la_table_1.

    Une jointure externe est une jointure qui prend toutes les lignes d'une table et affiche NULL pour l'autre table s'il n'y a pas de correspondance.

    Voir le cours de SQLPro pour plus d'explications.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Membre averti
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 28
    Par défaut
    Merci pour votre aide, j'ai trouvé la solution. Le SQL pour Access doit contenir des parenthèses sinon il ne comprend pas ce qu'on lui demande (voir message du 9 mai)
    Voici donc la commande SQL correcte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT R.DateResa, R.Conducteur, R.Remplacant, V.identification, M.nom AS nom, M.prenom AS prenom, MBR.nom AS nomR, MBR.prenom AS prenomR
    FROM ((tblReservations R
    INNER JOIN tblMembres M ON R.Conducteur = M.ID)
    LEFT JOIN tblMembres MBR ON R.Remplacant = MBR.ID)
    INNER JOIN tblVehicules V ON R.Vehicule = V.ID
    WHERE R.DateResa = CURRENT_DATE
    ORDER BY R.DateResa

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

Discussions similaires

  1. Comment afficher deux champs d'une table dans une comboBox
    Par lamia2007 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 12/04/2007, 08h17
  2. Comment avoir des informations sur une table ?
    Par Shogun dans le forum Oracle
    Réponses: 2
    Dernier message: 09/01/2007, 15h40
  3. Comment concatener deux champs d'une table d'une BDD.
    Par LESOLEIL dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/05/2006, 10h48
  4. Réponses: 10
    Dernier message: 19/09/2005, 22h24
  5. Comment récupérer le chemin d'une table liée
    Par ptitepunk dans le forum Access
    Réponses: 2
    Dernier message: 15/09/2005, 10h47

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