#1 Tue 03 May 2022 17:20
- barthsdee
- Participant occasionnel
- Date d'inscription: 23 Aug 2011
- Messages: 45
[HELP] Jointure postgre
Bonjour,
Je suis un débutant POSTGRE et je coince sur une jointure de table:
J'ai une table A incluant 3 colonnes
- Source1
- Source2
- Source3
Les valeurs de ces trois colonnes font référence à une autre table b à deux colonnes
- idsource
- libsource
Si je tente
From a
Left join b on a.source1=b.idsource
Je peux dès lors rapatrier l'information libsource dans ma base initiale
Mais je ne peux pas appliquer la même méthode pour les colonnes Source 2 ET 3.
Je dois peut être utilisé autre chose comme opérateur?
Hors ligne
#2 Tue 03 May 2022 17:52
- tevrard
- Participant assidu
- Date d'inscription: 23 May 2016
- Messages: 320
Re: [HELP] Jointure postgre
J'ai l'impression que c'est ta table A qui est mal construite...
Tu peux nous expliquer plus concrètement ce que tu espère obtenir de ta requête ( dans laquelle tu ne nous as pas précisé de SELECT)?
Notamment définir ce que représente Source 1, Source 2 et Source 3 et pourquoi c'est 3 colonnes différentes...
Hors ligne
#3 Wed 04 May 2022 08:43
- barthsdee
- Participant occasionnel
- Date d'inscription: 23 Aug 2011
- Messages: 45
Re: [HELP] Jointure postgre
Bonjour en fait c'est assez simple :
J'ai une base de données et je dois faire une vue concernant une douzaine de table,
quand il s'agit d'une jointure simple: ça passe
en revanche une des tables (appelons là table ETAT)va correspondre par exemple à une liste d'état (neuf , bon,médiocre...) elle est décomposée en deux colonnes un ID et le libellé
id => lib
01 => Bon
02 => Moyen
03 => Mauvais
Cette codification va pouvoir être appliquée plusieurs fois sur différents champs de la table mère (MERE)
Dans la vue, j'essaye d'obtenir des données explicites : rapatrier les libellés correspondant pour les différents champs ou cela s'avère nécessaire
on obtient donc
select
...... (liste des champs à prendre
MERE.etat1
MERE.etat2 (les valeurs de etat1 etat2 et etat 3 sont des valeursdont la définition est comprise dans la table état (des id))
MERE.etat3
L'objectif est de remplacer les caleurs d'id par leur libellés (un peu à l'instar de ce que donnerait une recherche v sous excel)
si je souhaite rapatrier la valeur lib correspondant à un état je rajoute les lignes
ETAT.lib (dans la catégorie select)
et on a ensuite
from mere
[...]
LEFT join xx.ETAT on MERE.etat1 = ETAT.id
Le souci est qu'en faisant cela on crée une jointure sur la base du champ etat1 de la table mère mais uniquement sur ce champ, seul le libellé correspondant à cet état pourra être rapatrié.
PS: Rajouter des jointures pour les champs MERE.etat2 et MERE.etat3 ne marche pas
Hors ligne
#4 Wed 04 May 2022 10:54
- tevrard
- Participant assidu
- Date d'inscription: 23 May 2016
- Messages: 320
Re: [HELP] Jointure postgre
Tu as réfléchis à passer par un CASE WHEN ?
Surtout si tu veux faire une vue derrière, tu peux caler ton case when directement dans la définition de la vue
Hors ligne
#5 Wed 04 May 2022 11:23
- barthsdee
- Participant occasionnel
- Date d'inscription: 23 Aug 2011
- Messages: 45
Re: [HELP] Jointure postgre
Je suis perdu sur le CASE WHEN (je suis vraiment un Noob)
J'ai pensé carrément changer les ID de la table état : les basculer de Integer vers du character varrying :dupliquer les valeurs de libellés au niveaux des ID et croiser les doigts pour que ma table mère répercute ces modifs
Hors ligne
#6 Wed 04 May 2022 11:44
Re: [HELP] Jointure postgre
Bonjour,
Si j'ai bien compris le besoin, il faut faire
Code:
SELECT m.id,e1.libelle AS etat1, e2.libelle AS etat2, e3.libelle AS etat3 FROM MERE m LEFT join xx.ETAT e1 on MERE.etat1 = ETAT.id LEFT join xx.ETAT e2 on MERE.etat2 = ETAT.id LEFT join xx.ETAT e3 on MERE.etat3 = ETAT.id
Jean-Marie
Azimut
Hors ligne
#7 Wed 04 May 2022 11:57
- p.jeremie
- Participant assidu
- Lieu: Valence
- Date d'inscription: 10 Sep 2017
- Messages: 427
Re: [HELP] Jointure postgre
Je confirme la proposition de jmarsac
Une autre possibilité est de faire des sous-requêtes mais moins efficace je pense (à vérifier).
Voir exemples :
http://sqlfiddle.com/#!5/99406/11/0
Hors ligne
#8 Thu 05 May 2022 11:38
- barthsdee
- Participant occasionnel
- Date d'inscription: 23 Aug 2011
- Messages: 45
Re: [HELP] Jointure postgre
Merci
Je confirme la chose
Concernant la partie jointure
Il faut créer les 3 liaisons en "nommant" à chaque fois la table exterieure d'une nouvelle variable (a,b,c...).
Coté Selection:
On rapatrie x fois la même colonne mais via ces 3 liaisons. Pour éviter les soucis, il va falloir nommer différemment ces trois colonnes (avec as)
a.colonne as libéllé_1,
b.colonne as libéllé_2,
c.colonne as libéllé_3,
Dernière modification par barthsdee (Thu 05 May 2022 11:54)
Hors ligne
#9 Thu 05 May 2022 12:03
- tevrard
- Participant assidu
- Date d'inscription: 23 May 2016
- Messages: 320
Re: [HELP] Jointure postgre
Code:
SELECT m.id,e1.libelle AS etat1, e2.libelle AS etat2, e3.libelle AS etat3 FROM MERE m LEFT join xx.ETAT e1 on m.etat1 = e1.id LEFT join xx.ETAT e2 on m.etat2 = e2.id LEFT join xx.ETAT e3 on m.etat3 = e3.id
Au niveau de la gestion des alias, ça doit être plus clair comme ca.
Et dans ton Select, ça te permet de mieux séparer les choses et de comprendre plus facilement d'où viennent les champs;
Ps : My bad , quand tu disais que tu avais essayer avec les jointures multiples, je pensais que c'était ce que tu avais fait
Dernière modification par tevrard (Thu 05 May 2022 12:04)
Hors ligne