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 :

Récupération multiple avec jointure


Sujet :

Langage SQL

  1. #1
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut Récupération multiple avec jointure
    Bonjour a tous,

    Je vais essayer de vous expliquer clairement mon probleme :

    pour faire simple j'ai deux tables, voici les principaux champs qui m'intéressent
    CLIENT(#id, nom)
    TELEPHONE(#id, num, type)

    par exemple pour un client : id=1, nom=moi
    dans la table téléphone j'ai
    - id=1, num=01.34.17...., type=fixe
    - id=1, num=061490...., type=portable

    ce que j'essaie de faire avec mon "niveau" en sql, c'est une sorte de
    id | nom | fixe | portable
    1 | moi |01... |06

    mais la je bloque depuis le début d'aprem...
    si quelqu'un avait quelque chose a me proposer, merci d'avance à lui

    bonne soirée

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Il faut que tu utilises deux instances de ta table TELEPHONE, l'une pour le fixe, l'autre pour le portable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT nom, T.num AS fixe, P.num AS portable
    FROM CLIENT C
      INNER JOIN TELEPHONE T ON C.id = T.id AND T.type = 'fixe'
      INNER JOIN TELEPHONE P ON C.id = P.id AND P.type = 'portable'

  3. #3
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    merci de ta réponse
    j'ai essayé de le réadapter à mon probleme avec la requete suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT nom, T.num AS fixe, P.num AS portable, M.ville
    FROM CLIENT C
      INNER JOIN TELEPHONE T ON C.id = T.id AND T.type = 'fixe'
      INNER JOIN TELEPHONE P ON C.id = P.id AND P.type = 'portable'
      INNER JOIN Maison M ON C.id = M.id
      where C.nom="moi"
    mais il me retourne rien en résultat...
    est ce normal ? j'ai du faire une erreur car le nom tester contient des numéro

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    A priori, je ne vois pas d'erreur, à part les guillemets à la place des apostrophes, mais ça n'est pas gênant.

    Peux-tu poster un échantillon de données ?

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    M.id ne serait-il pas plutôt l'identifiant de la maison que du client ?
    N'y aurait-il pas une clé étrangère contenant l'identifiant du client dans la table Maison ? Une colonne du genre 'idClient' ?

  6. #6
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    voici ma requete de base

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT U.IDGWise, U.Nom, U.Prenom,
    T.NumTel AS fixe, U.NumPoste, F.NumTel AS fax,  M.NumTel AS mobile
    FROM Utilisateur U
    	INNER JOIN Telephone T ON U.IDGWise = T.IDUtilisateur AND         T.TypeTel ='Voix' AND T.Technologie <>'GSM' AND T.Resilie='false'
    	INNER JOIN Telephone F ON U.IDGWise = F.IDUtilisateur AND F.TypeTel ='Fax' AND T.Resilie='false'
    	INNER JOIN Telephone M ON U.IDGWise = M.IDUtilisateur AND M.Technologie ='GSM' AND T.Resilie='false'
    celle ci fonctionne a part que j'ai un probleme si un utilisateur possède deux numeros de fixe....
    n'y a -til pas un moyen d'en garder qu'un quand la requete retourne plusieurs enregistrements pour le même utilisateur ????

  7. #7
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    M.id ne serait-il pas plutôt l'identifiant de la maison que du client ?
    N'y aurait-il pas une clé étrangère contenant l'identifiant du client dans la table Maison ? Une colonne du genre 'idClient' ?
    Citation Envoyé par koyot3 Voir le message
    celle ci fonctionne a part que j'ai un probleme si un utilisateur possède deux numeros de fixe....
    n'y a -til pas un moyen d'en garder qu'un quand la requete retourne plusieurs enregistrements pour le même utilisateur ????
    Peux-tu nous donner le code de création de tes tables ? as-tu résolu le problème avec Maison ? comment choisirais-tu entre les deux numéros de fixe ?

  8. #8
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    en fait ca marche pour la maison avec un "left join"
    ce probleme là est résolu....

    pour le probleme des doublons , dans l'idéal serait d'en prendre un des deux (ou plus) dispo en s'assurant qu'il n'est pas nul ....

    par exemple
    ID - FIXE - FAX
    1 - 0134 - 0234 <- celui ci
    1 - 0136 - 0856 <- ou celui la
    1 - null - 0654 <- mais pas celui si

    je sais pas si ma présentation est compréhensible ....
    encore merci

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Salut,
    Ton problème est assez similaire à celui-ci :
    http://www.developpez.net/forums/d64...-possible-sql/

  10. #10
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    merci pour ton lien..
    le probleme est que dans mon cas, dans la table téléphone, on peut avoir plusieurs numéros de fixes pour un client....

    je voudrais donc que dès qu'il y en a plusieurs, il n'en garde qu'un... (peu importe lequel...)

  11. #11
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par koyot3 Voir le message
    je voudrais donc que dès qu'il y en a plusieurs, il n'en garde qu'un... (peu importe lequel...)
    Citation Envoyé par koyot3 Voir le message
    pour le probleme des doublons , dans l'idéal serait d'en prendre un des deux (ou plus) dispo en s'assurant qu'il n'est pas nul ....
    Si ton seul critère est d'éliminer les NULL, le plus simple est encore de faire un MAX (ou un MIN) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT IDGWise, Nom, Prenom,
    MAX(T.NumTel) AS fixe, NumPoste, MAX(F.NumTel) AS fax,  MAX(M.NumTel) AS mobile
    FROM Utilisateur U
      INNER JOIN Telephone T ON U.IDGWise = T.IDUtilisateur AND T.TypeTel ='Voix' AND T.Technologie <>'GSM' AND T.Resilie='false'
      INNER JOIN Telephone F ON U.IDGWise = F.IDUtilisateur AND F.TypeTel ='Fax' AND T.Resilie='false'
      INNER JOIN Telephone M ON U.IDGWise = M.IDUtilisateur AND M.Technologie ='GSM' AND T.Resilie='false'
    GROUP BY IDGWise, Nom, Prenom, NumPoste
    EDIT : en fait, il n'y a pas besoin de sous-requête ; j'ai modifié mon code ci-dessus en conséquence

  12. #12
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    merci de ta réponse antoun...

    en supprimant les "null", il peut toujours en rester un ou deux ....
    je ne sais pas si c'est possible directement en sql...

    pour l'instant j'utilise un DataSet et je recherche les doublons dedans ...

  13. #13
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par koyot3 Voir le message
    en supprimant les "null", il peut toujours en rester un ou deux ....
    je ne sais pas si c'est possible directement en sql...
    euh... rien compris

    Toujours est-il que mes MAX vont préférer n'importe quel numéro à un NULL, mais renverront NULL s'il n'y a que ça. Je suppose que c'est ce que tu veux ?

  14. #14
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    non en fait pour faire simple
    avec la jointure sur la table téléphone j'obtient

    IdClient - numtel - type
    1 - 0134... - fixe
    1 - 0256... - fixe

    un client peut avoir deux numéro de fixe...
    avec la requete (enfin celle que tu m'as aidé à faire )
    je souhaiterais qu'elle ne prenne qu'un seul de ces 2 numéros (n'importe lequel)

    je ne sais pas si c'est plus clair

  15. #15
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par koyot3 Voir le message
    non en fait pour faire simple
    avec la jointure sur la table téléphone j'obtient

    IdClient - numtel - type
    1 - 0134... - fixe
    1 - 0256... - fixe

    un client peut avoir deux numéro de fixe...
    avec la requete (enfin celle que tu m'as aidé à faire )
    je souhaiterais qu'elle ne prenne qu'un seul de ces 2 numéros (n'importe lequel)

    je ne sais pas si c'est plus clair
    Ce n'est pas ce que te donne ma requête avec les MAX ?

  16. #16
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    non j'ai quand meme des doublons ...
    c'est bien ca le probleme ...

  17. #17
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    et si tu enlèves le U.NumPoste ?

  18. #18
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    non en fait c'est bon, ca marche ...
    j'avais fais une erreur de saisie...

    enfin !! en tout cas, merci beaucoup à toi pour le temps passer à (essayer de) me comprendre et me détailler comment résoudre mon pb...

    bonne journée

  19. #19
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    you welcome !

    On peut considérer que ce sujet est ?

Discussions similaires

  1. récupération multiple avec une seule requète
    Par rebel29270 dans le forum Requêtes
    Réponses: 7
    Dernier message: 04/12/2011, 19h01
  2. Requete SQL avec jointure multiple
    Par kissskoool dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/01/2008, 01h07
  3. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum Développement
    Réponses: 5
    Dernier message: 18/09/2007, 15h38
  4. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 18/09/2007, 15h38
  5. UPDATE multiple avec jointure
    Par PyRoFlo dans le forum Requêtes
    Réponses: 6
    Dernier message: 25/05/2006, 15h56

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