#1 Fri 02 February 2018 11:39
- Elys
- Participant actif
- Date d'inscription: 1 Mar 2016
- Messages: 54
PostGis jointure ligne - colonne
bonjour à tous,
je fais appel à vous car je suis un peu perdu pour une requete SQL.
J'ai deux table : "parcelle" qui est géométrique et représente des parcelles
"valeur" n'a pas de géométrie et qui est un tableau de valeurs à attribuer à "parcelle" en fonction de plusieurs paramètres.
Mes tables ont deux champs communs : a et b. En plus de sa "parcelle" a un champ c qui correspond aux titre des colonnes de "valeur".
J’essaie de faire une requête qui attribuera à chaque parcelle une valeur en fonction des champs a, b et c :
Code:
select pkey, surf_ha, commune, a, b, c, 01 from parcelle ## ici le 01 correspond à une colonne de la table valeur full outer join valeur on parcelle.a = valeur.a and parcelle.b = valeur.b where c = '01' group by pkey, 01, ## ici le 01 correspond à une colonne de la table valeur ORDER BY pkey
J'ai la deux problèmes:
1) c'est assez long, en effet c peut prendre 18 valeurs différentes (qui correspondent à 18 colonnes de la table valeur). Et j'ai 16 scénarios a étudier. J'aimerai donc faire toutes les valeurs de c en une fois si possible.
2) certaines parcelles réapparaissent plusieurs fois : j'obtiens 405 lignes alors que dans qgis, lorsque je séléctionne mes parcelles avec c = '01' j'ai 366 lignes.
je suis preneur de toutes vos bonnes idées.
merci d'avance :)
Dernière modification par Elys (Fri 02 February 2018 11:58)
Hors ligne
#2 Fri 02 February 2018 11:58
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: PostGis jointure ligne - colonne
Bonjour,
C'est pas très clair tout cela.
Pourquoi un FULL OUTER JOIN ?
Le couple de valeur a,b pour un enregistrement est-il une paire unique ? Ou formuler autrement existe il des enregistrement où :
parcelle.a=a1
parcelle.b=b1
valeur.a=a1
parcelle.b=b2
??
Et à quoi sert pkey ? (car une clef primaire c'est bien mais c'est aussi utile dans les jointures).
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#3 Fri 02 February 2018 12:56
- Elys
- Participant actif
- Date d'inscription: 1 Mar 2016
- Messages: 54
Re: PostGis jointure ligne - colonne
Bonjour et merci,
désolé, j'avais un peu modifié mon poste de base en même temps que vous deviez répondre.
Pour le full outer join, j'ai repris une autre requête qui utilisait cette jointure. Mais mon résultat est le même avec un join tout simple.
la pkey (unique pour une parcelle), je l'ai surtout ajoutée pour voir quelles parcelles posaient probleme et ressortaient plusieurs fois.
une seule parcelle ne peut avoir qu'un couple de valeurs a,b et un seul triplet de valeurs abc correspondant a une case valeur de la table valeur.
Hors ligne
#4 Fri 02 February 2018 14:12
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- Site web
Re: PostGis jointure ligne - colonne
Bonjour,
Regardez la doc de FULL OUTER JOIN, vous constaterez que le jeux de résultats est volumineux.
Faire ce type de jointure c'est comme si vous faisiez un LEFT JOIN UNION RIGHT JOIN.
D'où le temps d’exécution et les parcelles en double.
une seule parcelle ne peut avoir qu'un couple de valeurs a,b et un seul triplet de valeurs abc correspondant a une case valeur de la table valeur.
Donc c'est une relation 1 à 1 entre vos deux tables, il existe deux façons de l'écrire:
Code:
SELECT * FROM parcelle as p INNER JOIN valeur as v ON (p.a=v.a AND v.b=p.b AND p.c=v.c)
ou
Code:
SELECT * FROM parcelle as p,valeur as v WHERE p.a=v.a AND v.b=p.b AND p.c=v.c
Dernière modification par ChristopheV (Fri 02 February 2018 14:13)
Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close
Hors ligne
#5 Fri 02 February 2018 15:39
- Elys
- Participant actif
- Date d'inscription: 1 Mar 2016
- Messages: 54
Re: PostGis jointure ligne - colonne
En fait je me suis mal exprimé,
chaque parcelle ne peut avoir qu'une valeur de couple ab qui peut prendre différentes valeurs en fonction de son attribut c (ces valeurs sont stockées dans la table valeurs dans des colonnes "cout1", "cout2", ..., "cout18").
Peut-être que mon probleme sera plus clair si j' explique mon cheminement sous Qgis pour arriver au résultat attendu :
1) J'ai concaténer les valeurs des champ a et b de ma couches parcelle et ma table valeur dans une colonne ab.
2) J'ai joint ma table valeur à ma couche parcelle par le champ ab. J'obtient une table avec toutes les valeurs que peut prendre chaque parcelle en fonction de c, mais une seule est la bonne
3) Ensuite dans la table parcelle j'ai calculé ma colonne "valeur" dans par une formule :
CASE
WHEN "c" = 1 then "valeur1"
When "c" = 2 then "valeur2"
...
when "c" = 18 then "valeur18"
end
Merci encore pour vos coups de main
Hors ligne
#6 Fri 02 February 2018 23:49
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: PostGis jointure ligne - colonne
Salut,
Christophe a raison, vous n'avez pas vraiment besoin d'un FULL OUTER JOIN.
Voici ce que je propose :
Code:
SELECT * FROM parcelle JOIN ( SELECT a,b, col_val, c FROM valeur, LATERAL ROWS FROM ( unnest(ARRAY["01", "02", ...,"18"]), unnest(ARRAY['01', '02', ..., '18'])) foo(col_val, c) ) val USING (a,b,c)
L'idée est de créer une table à partir de chaque quadruplet
formé par les colonnes a et b et chaque couple nom de colonne / colonne
de la table valeur, et ce pour chacune de ses lignes,
pour pouvoir la joindre a la table parcelle.
On utilise pour se faire la fonctions d'ensemble unnest
qui tranforme un tableau en "table".
On constitue deux tableaux, un contenant le nom des colonnes,
,un autre contenant les valeurs,
et on utilise la syntaxe LATERAL ROWS FROM (...) pour s'assurer
que les deux "tables" renvoyées par les fonctions ne resulte pas en
un produit cartésien mais se "juxtaposent".
Dernière modification par tumasgiu (Sat 03 February 2018 10:17)
Hors ligne