banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

jmarsac
Participant assidu
Lieu: NICE
Date d'inscription: 26 Oct 2005
Messages: 572
Site web

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

 

Pied de page des forums

Powered by FluxBB