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 externe qui retourne 1 ligne par enregistrement


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut jointure externe qui retourne 1 ligne par enregistrement
    Bonjour à tous, j'essaie en vain de faire une requete sur les tables.
    Clients (ClientID, Name)
    Adresse (AdresseID, FK_ClientID, text)
    Telephone (telephoneID, FK_ClientID, numero)
    Un client peut donc avoir plusieurs adresses et numeros de telephone.

    J'essaye de faire une requete qui me retourne une ligne par client.
    Pour chaque client, afficher la premiere adresse et le premier numero de telephone s'ils en ont, null sinon.

    J'avais fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Select cli.name, adr.text, tel.numero
    from clients
    left outer join Adresse adr on cli.ClientID=adr.FK_ClientID
    left outer join Telephone tel on cli.ClientID=tel.FK_ClientID
    Mais ça me renvoie plusieurs ligne si un client à plusieurs numeros...
    Auriez-vous une idée de comment je dois faire ?

  2. #2
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Option 1 (bof bof): utiliser min ou max pour ne récupérer qu'une ligne
    Option 2 (application) (bof bof): Ne rien toucher à la requête et n'afficher au niveau de l'application qu'une ligne par client

    Option 3 (celle que je préconiserait) : Tu ajoutes un champ de type booléen par_defaut dans la table adresse et dans la table téléphone. Tu modifies ton application (typiquement avec un bouton radio dans le formulaire) pour être certain que si il y a au moins une adresse pour ton client alors il y a une et une seule adresse par défaut. Idem pour le téléphone.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    En fait ce n'est pas pour inserer dans une application, c'est juste qu'il me faut la liste telle que je vous l'ai expliquée.

    La table est déjà remplie de plusieurs dizaines de millier de clients et la requete que je veux faire sera executée à la main, théoriquement une seule fois.
    Et en plus, c'est aussi pour apprendre...

    Je pense que la solution min/max irait, mais je ne sais pas comment faire.

  4. #4
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select cli.name, min(adr.text), min(tel.numero)
    from clients
    left outer join Adresse adr on cli.ClientID=adr.FK_ClientID
    left outer join Telephone tel on cli.ClientID=tel.FK_ClientID
    group by cli.name
    Je n'ai pas testé, mais bon ca doit marché.

  5. #5
    Membre du Club
    Inscrit en
    Mars 2005
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 78
    Points : 51
    Points
    51
    Par défaut
    Alexandre, d'après ce que je comprends, ta requete renverrait bien une ligne par client mais l'adresse affichée serait la première par ordre alphabetique, idem pour le numero de telephone.

    Au final, j'ai réussi, mais c'est loin d'être beau à voir, peut-être qu'il y a mieux à faire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Select cli.name, adr.text, tel.numero
      from clients left outer join Adresse adr 
      on (adr.AdresseID in (select min(AdressID) 
                              from Adresse
                             where FK_ClientID=cli.ClientID))
                   left outer join Telephone tel on cli.ClientID=tel.FK_ClientID

  6. #6
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Citation Envoyé par goony
    Alexandre, d'après ce que je comprends, ta requete renverrait bien une ligne par client mais l'adresse affichée serait la première par ordre alphabetique,
    d'où le bof bof bof

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

Discussions similaires

  1. Jointure externe qui ne fonctionne pas
    Par juvamine dans le forum SQL
    Réponses: 6
    Dernier message: 28/10/2008, 12h26
  2. Jointure externe, qui ne retourne rien.
    Par guitou0 dans le forum SQL
    Réponses: 11
    Dernier message: 30/04/2008, 14h35
  3. Jointure simple qui ne passe pas par les index ?!
    Par souch dans le forum Oracle
    Réponses: 13
    Dernier message: 24/07/2007, 18h03
  4. Réponses: 14
    Dernier message: 09/04/2004, 14h44
  5. Jointure externe qui ne fonctionne pas
    Par Guizz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2004, 13h26

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