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

Requêtes PostgreSQL Discussion :

Extraire données de plusieurs tables


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut Extraire données de plusieurs tables
    Bonjour,
    j'ai 4 tables (A,B,C,D) reliées par les relations suivantes
    A.id = B.ref = C.id = D.id
    quelle requête utilisée pour extraire des données simultanément de
    ces 4 tables?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select * from A,B,C,D where
    A.id = B.ref and
    C.id = B.ref and
    D.id = B.ref
    ne fonctionne pas.!

  2. #2
    Membre éclairé Avatar de juvamine
    Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2004
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2004
    Messages : 414
    Par défaut
    cette requete devrait fonctionner normalement
    elle te retourne une erreur ?

    essaie avec des jointures normalisées
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select * 
    from A
    inner join B ON A.id = B.ref
    inner join C ON C.id = B.ref
    inner join D ON D.id = B.ref
    si tous les A n'ont pas de B et/ou que tous les B n'ont pas de C et/ou que tous les B n'ont pas de D il faudra utiliser une jointure externe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select * 
    from A
    left outer join B ON A.id = B.ref
    left outer join C ON C.id = B.ref
    left outer join D ON D.id = B.ref
    A+
    juva

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut
    merci pour la réponse,
    la jointure externe marche bien, sauf que j'ai des doublons.
    des ligne avec les mêmes A.id, B.ref mais dont une uniquement avec C.id et la deuxième avec uniquement D.id
    or je souhaite avec une seule ligne avec C.id et D.id
    merci

  4. #4
    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
    Euh... tu peux donner un exemple ?
    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 !

  5. #5
    Membre éclairé Avatar de juvamine
    Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2004
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2004
    Messages : 414
    Par défaut
    Je demande aussi un exemple...j'ai pas compris

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut
    Citation Envoyé par juvamine Voir le message
    Je demande aussi un exemple...j'ai pas compris
    exemple
    ligne 1 : 12 15 "ici rien" 10
    ligne 2: 12 15 25 "ici rien"
    j'aimerais avoir une seule ligne 12 15 25 10

  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 as une troisième ligne :
    12 15 32 11

    Quel est le résultat attendu et pourquoi ?
    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
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Si tu as une troisième ligne :
    12 15 32 11

    Quel est le résultat attendu et pourquoi ?
    le resultat attendu est
    ligne 1: 12 15 25 10
    linge 2 : 12 15 32 11

  9. #9
    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
    C'est problématique ton truc.

    Il est logique que le SGBD retourne, non pas ce que tu appelles des doublons, mais les lignes avec des NULL quand la valeur est absente dans la jointure externe.

    Tu devrais nous expliquer davantage la nature de ton besoin :
    - Quelles données contient ta BDD?
    - Que représente concrêtement le résultat que tu souhaites obtenir ?
    Ainsi que la structure de tes tables.
    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 !

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut
    en fait c'est l'ordre de jointure qui il faut regarder,
    joindre B,C,d puis A

  11. #11
    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
    Citation Envoyé par lemarin Voir le message
    en fait c'est l'ordre de jointure qui il faut regarder,
    joindre B,C,d puis A
    Ca ne répond pas à mes question donc ne m'éclaire pas davantage pour essayer de t'aider.
    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 !

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut
    table A contient (id,name)
    table B contient (id,typeid)
    table C contient (id,name)
    table D contient (id,name)
    table E contient (id,name)

    A.id = B.id
    C.id=B.typeid
    D.id=B.typeid
    E.id=B.typeid

    pour chaque A.id je veux recuperer les names et ids qui sont dans (C,D,E)
    avec la condition ( typeid IN (1,2,3) ) car un A.id peut avoir un ou plusieurs B.typeid

    Merci

  13. #13
    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
    Citation Envoyé par lemarin Voir le message
    pour chaque A.id je veux recuperer les names et ids qui sont dans (C,D,E)
    avec la condition ( typeid IN (1,2,3) ) car un A.id peut avoir un ou plusieurs B.typeid
    La requête qui devrait répondre à ton besoin est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT C.id AS id_C, C.name AS name_C
      D.id AS id_D, D.name AS name_D
      E.id AS id_E, E.name AS name_E
    FROM A
    INNER JOIN B ON A.id = B.id
    LEFT OUTER JOIN C ON C.id = B.typeid
    LEFT OUTER JOIN D ON D.id = B.typeid
    LEFT OUTER JOIN E ON E.id = B.typeid
    WHERE B.typeid IN (1, 2, 3)
    Mais si tu as un A qui n'a pas de C ou de D ou E, tu auras les colonnes correspondantes à NULL. C'est comme ça que fonctionne un SGBD.

    Après c'est au programme utilisateur de se débrouiller pour afficher les données comme tu le souhaites.

    Donne-nous éventuellement des données exemples de tes tables pour tester.

    Et on ne sait toujours pas à quoi se réfèrent ces id, typeid et name ! Des noms de personnes, de légumes, de machines... ?

    C'est dur de comprendre un truc aussi abstrait !
    Quelle est la raison de cette structure de tables ?
    Quelles sont les cardinalités entre ces tables ?
    Les id sont-ils tous des clés primaires ?
    Et un besoin exprimé par une phrase claire en français aiderait aussi à la compréhension. Un truc du genre : "Sélectionner les noms des personnes qui sont dans le même groupe que les personnes ayant pour identifiant 1, 2 ou 3."
    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 !

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut
    en fait le probleme que j'ai est le suivant :
    lorsque un A a Un D et un C, j'ai deux lignes ou lieu d'une !
    ligne 1: A D "rien"
    ligne 2: A "rien" C
    comment faire pour avoir A D C? je ne veux pas deux fois le A.id dans mon résultat ! en sachant que j'ai mis un
    select distinct...
    pour des raisons de confidentialité, je ne peux pas données un échantillon de mes données.
    merci

  15. #15
    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
    Citation Envoyé par lemarin Voir le message
    en fait le probleme que j'ai est le suivant :
    lorsque un A a Un D et un C, j'ai deux lignes ou lieu d'une !
    ligne 1: A D "rien"
    ligne 2: A "rien" C
    Ca j'avais compris, c'est déjà à peu près l'exemple que tu nous as donné plus haut.

    comment faire pour avoir A D C? je ne veux pas deux fois le A.id dans mon résultat !
    C'est un comportement normal du SGBD à cause de la jointure externe.
    en sachant que j'ai mis un
    select distinct...
    DISTINCT s'applique à toute la ligne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT A, B, C, D
    Ca donnera tous les quadruplets {A, B, C, D} différents.
    Et donc tu pourras avoir de nouveau plusieurs fois le A.
    A1, B1, C1, D1
    A1, B2, C1, D1
    A1, B1, C2, D1
    ...

    Ce que tu ne comprends pas c'est que le SGBD ne peut pas choisir de lui même quelle priorité donner selon les données qu'il joint.

    Si le résultat de la requête actuelle donne ceci :
    A1, B1, C1, D1
    A1, B1, NULL, NULL
    A1, B1, C2, NULL
    A1, B1, NULL, D2
    A1, B1, C3, NULL
    A1, B1, NULL, D3
    A1, B1, NULL, D4

    Le SGBD est incapable de savoir s'il faut privilégier le quadruplet complet {A1, B1, C2, D2} ou bien {A1, B1, C3, D3} ou bien {A1, B1, C2, D3} ou bien...

    Alors comme tu nous dis toujours pas de quoi il s'agit, on ne comprend pas la raison de ce besoin et on ne peut que te répondre théoriquement et par la réalité de ce que fait normalement un SGBD qui est un calculateur ensembliste.
    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 !

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut
    Ok, supposons que ds la table A j'ai id comme pk et name = nom personne
    table B : typeid = sexe (1,2, NA) na=non indiqué
    les id de c,d,e sont des pk c.name = sa ville natale
    d.name = département natal
    e.name = pays natal
    je souhaite avoir toutes les information concernant cette personne à partir de toutes les tables?

  17. #17
    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
    Citation Envoyé par lemarin Voir le message
    Ok, supposons que ds la table A j'ai id comme pk et name = nom personne
    table B : typeid = sexe (1,2, NA) na=non indiqué
    les id de c,d,e sont des pk c.name = sa ville natale
    d.name = département natal
    e.name = pays natal
    je souhaite avoir toutes les information concernant cette personne à partir de toutes les tables?
    A partir de cette structure, discutable d'ailleurs, et le besoin exprimé, une banale jointure externe à partir de A donnera les infos disponibles et NULL si cette info n'existe pas.
    Mais comme une personne n'a en principe qu'un sexe, qu'une ville natale située dans un seul département et/ou un seul pays, il n'y aura qu'une ligne par personne donc je ne crois pas que cet exemple reflète ce que tu as donné précédemment.
    table A contient (id,name)
    table B contient (id,typeid)
    table C contient (id,name)
    table D contient (id,name)
    table E contient (id,name)

    A.id = B.id
    C.id=B.typeid
    D.id=B.typeid
    E.id=B.typeid
    D'après ton dernier descriptif, tu relies la ville, le département et le pays au sexe et non à la personne !

    Quand je disais plus haut que la structure est discutable, c'est parce qu'une ville est forcément située dans un pays. Relier la personne au pays, dans la mesure où on connais sa ville, est une redondance inutile. C'est la ville qu'il faut relier au pays... et au département si c'est une ville française.
    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 !

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut
    je suis d'accord avec toi, j'ai essayé de données un exemple mais ce n'est pas logique, cela ne respecte pas le schéma de départ, mais revenons justement au schéma de départ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    table A contient (id,name)
    table B contient (id,typeid)
    table C contient (id,name)
    table D contient (id,name)
    table E contient (id,name)
     
    A.id = B.id
    C.id=B.typeid
    D.id=B.typeid
    E.id=B.typeid
    comment avoir une seule ligne de A dans le résultat? même si C,D ou E est vide ?
    en fait un A.id peut avoir de 0 à 3 B.typeid, et les attribut de chaque b.typeid sont stockés das C,D ou E.
    donc si un A.id possède de B.typeid (ex C,D) j'ai en sortie 2 lignes, comment faire lui dire de prendre tout en une fois?
    j'espère que c'est claire
    et merci beaucoup pour l'aide

  19. #19
    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
    Tu dis toi-même :
    un A.id peut avoir de 0 à 3 B.typeid
    Donc il y aura forcément de 0 à 3 lignes !
    Si tu veux une présentation différente de ces 3 lignes, c'est de la cosmétique et ce n'est pas le boulot du SGBD mais du logiciel qui extrait les données et les présente à l'utilisateur.
    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 !

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Par défaut
    Ok merci, je vais essayer de customiser lol

Discussions similaires

  1. Extraire les données de plusieurs tables [Talend-Java]
    Par ADBows dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 18/08/2011, 00h53
  2. [Débutant] Parcourir les données de plusieurs tables.
    Par SmokE dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/01/2006, 16h55
  3. Réponses: 10
    Dernier message: 15/09/2005, 12h31
  4. Réponses: 7
    Dernier message: 12/10/2004, 16h43
  5. Réponses: 6
    Dernier message: 15/04/2004, 11h04

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