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 Wed 24 July 2013 09:46

PaulH
Participant assidu
Lieu: Nantes
Date d'inscription: 1 Aug 2007
Messages: 463

Question : liaison table postgres

Bonjour,

Je suis en train de monter une BD sous postgreSQL 9.2.

J'ai deux tables de référence:
- 1 commune
- 1 scot.

Dans ma table commune, ma clef primaire est le code_insee. De plus, elle contient un champ "scot" contenant l'ID des territoires scot.
Dans ma table scot, ma clef primaire est le code_scot.

La table scot correspond a des sous-territoire (5 lignes), regroupant plusieurs communes (15 lignes) mais ne représentant pas des périmètres administratifs en tant que tels.

J'ai mis une contrainte sur ma table commune en lui administrant une clef étrangère (clefscot).


Là commence mes problème quand je cherche à vérifier si mes tables sont bien reliées, quand je tape la requête suivante:

SELECT
  commune.libelle_commune,
  commune.code_insee,
  scot.libelle_scot
FROM
  tables_de_references.commune,
  tables_de_references.scot;

J'obtiens un résultat à 75 lignes. Toutes mes communes apparaissent 5 fois alors qu'elles ne peuvent en réalité appartenir qu'à un sous-territoire scot...

Je n'arrive pas à comprendre pourquoi la liaison ne marche pas...

Je vous remercie d'avance pour votre aide.


Paul Hedin

ex-luern

Hors ligne

 

#2 Wed 24 July 2013 10:04

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: Question : liaison table postgres

Bonjour.
vous n'avez pas précisé les champs de jointure dans votre requête, donc il fait le lien automatiquement entre tous les enregistrements de toutes les tables et vous ressort toutes les solutions possibles au lieu de filtrer uniquement les enregistrements  ayant une valeur d'attribut commune.
JPL

Hors ligne

 

#3 Wed 24 July 2013 10:23

PaulH
Participant assidu
Lieu: Nantes
Date d'inscription: 1 Aug 2007
Messages: 463

Re: Question : liaison table postgres

Effectivement, en rajoutant, je pensais que comme la liaison avait été créée, ce n'était pas la peine de remettre la condition à chaque fois.

SELECT
  scot.libelle_scot,
  scot.code_scot,
  commune.scot,
  commune.libelle_commune
FROM
  tables_de_references.commune,
  tables_de_references.scot
WHERE
  commune.scot = scot.code_scot;


Merci.
Je vais continuer en essayant de lier une table contenant des informations diverses (population, etc...) et sortir mes requêtes.

J vous remercie en tout cas.


Paul Hedin

ex-luern

Hors ligne

 

#4 Wed 24 July 2013 12:20

PaulH
Participant assidu
Lieu: Nantes
Date d'inscription: 1 Aug 2007
Messages: 463

Re: Question : liaison table postgres

J'ai un autre problème concernant l'opérateur GROUP BY.

J'ai bien rajouté ma 3 tables lié à celle commune par code_commune. Les liaisons fonctionnent car je peux requêter et afficher des champs des 3 tables correctement (commune, scot et population)

Mon souhait est d'allé un peu plus loin en regroupant par sous-territoire scot les attributs de ma table population (ex pop_mun) et obtenir donc la somme par sous-territoire de ma population.

J'ai lancé la requête suivante mais elle ne marche pas:

SELECT
  commune.epci,
  commune.code_insee_epci,
  scot.libelle_scot,
  epls.logtot2010
FROM
  tables_de_references.commune,
  meddtl.epls,
  tables_de_references.scot

GROUP BY
  tables_de_references.commune,
  meddtl.epls,

WHERE
  commune.code_insee = epls.codgeo AND
  scot.code_scot = commune.scot;

Je n'arrive pas à descellé l'erreur ou alors ce n'est pas un GROUP BY.

Je vous remercie.


Paul Hedin

ex-luern

Hors ligne

 

#5 Wed 24 July 2013 13:51

Benoit91
Participant assidu
Date d'inscription: 2 Oct 2008
Messages: 263

Re: Question : liaison table postgres

Bonjour

Un GROUP BY doit toujours être après une clause WHERE.

Le GROUP BY doit également reprendre l'ensemble des champs listés dans le SELECT (ce n'est pas le cas dans Mysql).

De plus si vous voulez faire une somme des populations il faudra utiliser une fonction sum(nom du champ) dans la clause SELECT.
par exemple:


SELECT
  commune.epci,
  commune.code_insee_epci,
  scot.libelle_scot,
  sum(epls.logtot2010)
FROM
  tables_de_references.commune,
  meddtl.epls,
  tables_de_references.scot
WHERE
  commune.code_insee = epls.codgeo AND
  scot.code_scot = commune.scot
GROUP BY
  tables_de_references.commune,
  meddtl.epls,

A mon avis cette requête ne fonctionnera pas, mais il faut respecter cette architecture dans la requête.

A mon avis dès que vous avez à joindre plus de 2 tables il vaut mieux utiliser les clause JOIN ma_table1.champ1 ON ma_table2.champ1 ce qui vous libère la clause WHERE pour allez encore plus loin dans la requête.

Cordialement.

Hors ligne

 

#6 Wed 24 July 2013 14:01

VianneyD
Participant assidu
Date d'inscription: 30 May 2011
Messages: 153

Re: Question : liaison table postgres

Bonjour,

Le GROUP BY doit plutot apparaitre à la fin de la commande.
L'expression du GROUP BY ne doit pas être une table mais une colonne ou une expression calculée sur une ou plusieurs colonnes.

En outre, je ne comprends pas trop l'intérêt d'un GROUP BY car je ne vois pas de fonction d'aggrégat dans ta requête.
Si c'est pour éviter les lignes redondantes, j'utiliserais plutot un DISTINCT ou un DISTINCT ON, par exemple

Code:

SELECT DISTINCT
  commune.epci,
  commune.code_insee_epci,
  scot.libelle_scot,
  epls.logtot2010
FROM
  tables_de_references.commune,
  meddtl.epls,
  tables_de_references.scot

WHERE
  commune.code_insee = epls.codgeo AND
  scot.code_scot = commune.scot;

Vianney Dugrain

Hors ligne

 

#7 Wed 24 July 2013 14:45

PaulH
Participant assidu
Lieu: Nantes
Date d'inscription: 1 Aug 2007
Messages: 463

Re: Question : liaison table postgres

Merci pour vos retours.

En fait je veux calculer ma population selon les sous territoire de mon scot et nom par communes.
J'ai donc 3 table:
- population
- commune
-scot

avec pour jointure le "code_commune" entre population et commune et le "code scot" entre commune et scot. L'agrégat existe car je souhaite additionner la population de plusieurs communes (qui correspondent à mes sous-territoire scot).

Je pensais qu'avec un GROUP BY, cela me le faisait mais je me trompe apparement.

Ta requête fonctionne VianneyD mais les redondances existent toujours et n'additionnent pas la population selon scot.libelle_scot.

Je n'arrive pas à insérer JOIN et SUM dedans.


Paul Hedin

ex-luern

Hors ligne

 

#8 Wed 24 July 2013 14:54

PaulH
Participant assidu
Lieu: Nantes
Date d'inscription: 1 Aug 2007
Messages: 463

Re: Question : liaison table postgres

Avec cette requête, j'obtiens le résultat que je souhaite mais je ne pense pas comme vous l'avez dit qu'elle soit la plus pertinente et "légère" dans la construction...JOIN me permettrait-il d'alléger (mais il faudrait faire 2 JOIN pour relier mes 3 tables):


SELECT
  scot.libelle_scot,
  sum(epls.logtot2010)
FROM
  tables_de_references.commune,
  meddtl.epls,
  tables_de_references.scot
WHERE
  commune.codgeo = epls.codgeo AND
  scot.code_scot = commune.scot
GROUP BY
  scot.code_scot;


Paul Hedin

ex-luern

Hors ligne

 

#9 Wed 24 July 2013 16:01

PaulH
Participant assidu
Lieu: Nantes
Date d'inscription: 1 Aug 2007
Messages: 463

Re: Question : liaison table postgres

J'ai une autre interrogation insolvable pr le moment...

en partant de la même requête, je souhaiterais pouvoir avoir en sortie à la suite de mon agrégat de sous-territoire scot, la liste de mes communes avec leurs chiffres propres.

J'obtiendrais donc en ligne mes 15 communes et mes 5 ss territoires et en colonnes mes champs additionnés ou non selon.

Est ce que cette opération est possible ou faut-il passer par 2 requêtes différentes?

Merci bcp (promis après j'arrête de vous embêter).


Paul Hedin

ex-luern

Hors ligne

 

#10 Wed 24 July 2013 17:22

PaulH
Participant assidu
Lieu: Nantes
Date d'inscription: 1 Aug 2007
Messages: 463

Re: Question : liaison table postgres

Je pense avoir trouver (si ça peut servir à qq1), la structure n'est toujours pas forcément très légère...

SELECT
  scot.libelle_scot,
  sum(epls.logtot2010)"log_tot_10",
  sum(epls.logtot2009)"log_tot_09",
  sum(epls.logtot2008)"log_tot_08",
  sum(epls.logtot2007)"log_tot_07",
  sum(epls.logtot2006)"log_tot_06",
  sum(epls.logtot2005)"log_tot_05",
  sum(epls.logtot2004)"log_tot_04",
  sum(epls.logtot2003)"log_tot_03",
  sum(epls.logtot2002)"log_tot_02",
  sum(epls.logtot2001)"log_tot_01",
  sum(epls.logtot2000)"log_tot_00"
FROM
  tables_de_references.commune,
  meddtl.epls,
  tables_de_references.scot
WHERE
  commune.codgeo = epls.codgeo AND
  scot.code_scot = commune.scot
GROUP BY
  scot.code_scot

UNION

SELECT
  commune.libelle_commune,
  sum(epls.logtot2010)"log_tot_10",
  sum(epls.logtot2009)"log_tot_09",
  sum(epls.logtot2008)"log_tot_08",
  sum(epls.logtot2007)"log_tot_07",
  sum(epls.logtot2006)"log_tot_06",
  sum(epls.logtot2005)"log_tot_05",
  sum(epls.logtot2004)"log_tot_04",
  sum(epls.logtot2003)"log_tot_03",
  sum(epls.logtot2002)"log_tot_02",
  sum(epls.logtot2001)"log_tot_01",
  sum(epls.logtot2000)"log_tot_00"
FROM
  tables_de_references.commune,
  meddtl.epls,
  tables_de_references.scot
WHERE
  commune.codgeo = epls.codgeo AND
  scot.code_scot = commune.scot
GROUP BY
  commune.libelle_commune;


Il faut au final que je rajoute un ORDER BY pour que le classement commune, sous-territoire scot se fassent mais c'est pas mal, si qq1 a une autre solution à partager, je suis preneur.

MErci !!!!


Paul Hedin

ex-luern

Hors ligne

 

#11 Thu 25 July 2013 12:17

Benoit91
Participant assidu
Date d'inscription: 2 Oct 2008
Messages: 263

Re: Question : liaison table postgres

Bonjour

Sur votre requête qui fonctionne vous pouvez tester la rédaction suivante pour l'intégration des JOIN  ON:


SELECT
  scot.libelle_scot,
  sum(epls.logtot2010)
FROM
  tables_de_references.commune,
  meddtl.epls,
  tables_de_references.scot

JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
AND JOIN tables_de_references.scot  ON commune.scot=scot.code_scot

WHERE 1=1

GROUP BY scot.code_scot;

Par contre c'est étonnant que vous puissiez faire un GROUP BY sur le champ code_scot qui ne figure pas dans votre SELECT.

Hors ligne

 

#12 Thu 25 July 2013 13:54

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1230
Site web

Re: Question : liaison table postgres

Bonjour,

la clause WHERE 1=1 n'est pas utile.


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#13 Fri 26 July 2013 10:40

PaulH
Participant assidu
Lieu: Nantes
Date d'inscription: 1 Aug 2007
Messages: 463

Re: Question : liaison table postgres

La requête ne marche pas avec ou sans le WHERE avec ce message:

"ERREUR:  erreur de syntaxe sur ou près de « tables_de_references »
LINE 10: AND JOIN tables_de_references.scot  ON commune.scot=scot.cod..."


Cette requête reste à dédoubler pour rajouter la clause UNION non?

Et comment puis-je ordonner mon résultat pour avoir mes communes et ensuite mes ss-territoire scot car là, ils sont tous mélangés.
Quand je rajoute un ORDER BY il y a erreur...

Dernière modification par luern (Fri 26 July 2013 10:54)


Paul Hedin

ex-luern

Hors ligne

 

#14 Fri 26 July 2013 12:05

Benoit91
Participant assidu
Date d'inscription: 2 Oct 2008
Messages: 263

Re: Question : liaison table postgres

Bonjour

Autant pour moi il ne faut pas mettre AND devant le 2ème JOIN
soit

SELECT
  scot.libelle_scot,
  sum(epls.logtot2010)
FROM
  tables_de_references.commune,
  meddtl.epls,
  tables_de_references.scot

JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
JOIN tables_de_references.scot  ON commune.scot=scot.code_scot

GROUP BY scot.code_scot;

la clause UNION vous permet d'ajouter le résultat d'une autre requête (encore faut-il que les champ de la requête 1 et requête 2 soient identiques) donc oui vous êtes obligé de dédoubler la requête.

Hors ligne

 

#15 Fri 26 July 2013 12:46

PaulH
Participant assidu
Lieu: Nantes
Date d'inscription: 1 Aug 2007
Messages: 463

Re: Question : liaison table postgres

arf....

ERREUR:  référence invalide d'une entrée de la clause FROM pour la table « epls »
LINE 9: JOIN tables_de_references.commune ON meddtl.epls.codgeo = co...
                                             ^
HINT:  Il existe une entrée pour la table « epls » mais elle ne peut pas être
référencée de cette partie de la requête.



Je ne comprends plus trop...


Paul Hedin

ex-luern

Hors ligne

 

#16 Fri 26 July 2013 13:37

Benoit91
Participant assidu
Date d'inscription: 2 Oct 2008
Messages: 263

Re: Question : liaison table postgres

Essayez comme cela:

SELECT
  scot.libelle_scot,
  sum(epls.logtot2010)
FROM
  tables_de_references.scot

JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
JOIN tables_de_references.scot  ON commune.scot=scot.code_scot

GROUP BY scot.code_scot;

Hors ligne

 

#17 Fri 26 July 2013 15:00

PaulH
Participant assidu
Lieu: Nantes
Date d'inscription: 1 Aug 2007
Messages: 463

Re: Question : liaison table postgres

Je suis désolé et ce n'est pas non plus ds l'esprit du forum mais ça ne marche pas non plus..


ERREUR:  entrée manquante de la clause FROM pour la table « epls »
LINE 7: JOIN tables_de_references.commune ON meddtl.epls.codgeo = co...

et qd je rajoute (cf ligne en gras ci-dessous):

SELECT
  scot.libelle_scot,
  sum(epls.logtot2010)
FROM
  tables_de_references.scot,
  meddtl.epls

JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
JOIN tables_de_references.scot  ON commune.scot=scot.code_scot

GROUP BY scot.code_scot;


cette erreur apparait:
ERREUR:  le nom de la table « scot » est spécifié plus d'une fois


Paul Hedin

ex-luern

Hors ligne

 

#18 Fri 26 July 2013 15:13

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1230
Site web

Re: Question : liaison table postgres

Bonjour,

ERREUR:  le nom de la table « scot » est spécifié plus d'une fois


Code:

SELECT
  scot.libelle_scot,
  sum(epls.logtot2010)
FROM
meddtl.epls JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
JOIN tables_de_references.scot  ON commune.scot=scot.code_scot
GROUP BY scot.code_scot;

devrait fonctionner cette fois. La table "scot" était bien appelée 2 fois.

Dernière modification par MathieuB (Fri 26 July 2013 15:13)


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#19 Fri 26 July 2013 15:21

PaulH
Participant assidu
Lieu: Nantes
Date d'inscription: 1 Aug 2007
Messages: 463

Re: Question : liaison table postgres

C'est bon ça marche!

Alors pourquoi appeler dans le FROM le meddtl.epls et pas scot ou encore pourquoi ne pas appeler les 2 tables?
Pour finir j'ai rajouté un ORDER BY à la fin et ça marche, contrairement à ma première requête.

Va falloir que je teste avec l'UNION maintenant!!


Merci en tout cas à vous deux !!! tongue


Paul Hedin

ex-luern

Hors ligne

 

#20 Fri 26 July 2013 15:27

PaulH
Participant assidu
Lieu: Nantes
Date d'inscription: 1 Aug 2007
Messages: 463

Re: Question : liaison table postgres

arf....quand je rajoute un ORDER BY à la requête simple, elle marche mais avec UNION ça renvoie une erreur...
et inversement quand j'enlève mes ORDER BY et que je mets UNION, la requête fonctionne...


Paul Hedin

ex-luern

Hors ligne

 

#21 Fri 26 July 2013 16:00

PaulH
Participant assidu
Lieu: Nantes
Date d'inscription: 1 Aug 2007
Messages: 463

Re: Question : liaison table postgres

(SELECT
  scot.libelle_scot,
  sum(epls.logtot2010)
FROM
meddtl.epls
JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
JOIN tables_de_references.scot  ON commune.scot=scot.code_scot
GROUP BY scot.code_scot
ORDER BY scot.code_scot)

UNION

(SELECT
  commune.libelle_commune,
  sum(epls.logtot2010)
FROM
meddtl.epls
JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
JOIN tables_de_references.scot  ON commune.scot=scot.code_scot
GROUP BY commune.codgeo
ORDER BY commune.codgeo);


avec cette requête je n'ai rien de classé, l'ORDER BY n'est pas pris en compte...


Paul Hedin

ex-luern

Hors ligne

 

#22 Fri 26 July 2013 16:36

MathieuB
Membre du bureau
Lieu: Montpellier
Date d'inscription: 18 Jan 2006
Messages: 1230
Site web

Re: Question : liaison table postgres

Bonjour,

dans le FROM, les 3 tables "epls", "commune" et "scot" sont bien appelées. Les tables jointes (JOIN) sont dans la clause FROM.

Code:

FROM a JOIN b ON a.id = b.id JOIN c ON c.id = b.id

équivaut à

Code:

FROM a, b, c WHERE a.id = b.id AND c.id = b.id

Enfin vos ORDER BY sont effectués sur des colonnes qui ne sont pas dans le select...


Mathieu BOSSAERT
Association GeoRezo

Hors ligne

 

#23 Fri 26 July 2013 16:38

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Question : liaison table postgres

Bonjour,

La clause ORDER BY doit apparaitre a la fin de la requete, donc a la fin de vos deux requetes liées par un UNION.
Un seul order by à la fin est suffisant.

Nicolas

Hors ligne

 

#24 Mon 29 July 2013 15:34

PaulH
Participant assidu
Lieu: Nantes
Date d'inscription: 1 Aug 2007
Messages: 463

Re: Question : liaison table postgres

Encore une fois je reviens vers vous...J'ai reconstruit une requête à partir de vos différents conseils. Mais je n'arrive toujours pas à ordonner en selon le schéma suivant: 1/ communes, 2/ epci 3/ pays

Code:

SELECT libelle_geo,log_tot_10
FROM(

SELECT
commune.libelle_commune as libelle_geo,
sum(epls.logtot2010) as log_tot_10

FROM
meddtl.epls
JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
JOIN tables_de_references.epci ON commune.epci=epci.code_insee_epci
GROUP BY commune.codgeo

UNION

SELECT
pays.libelle_pays as libelle_geo,
sum(epls.logtot2010) as log_tot_10

FROM
meddtl.epls
JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
JOIN tables_de_references.pays ON commune.pays=pays.pays_code
GROUP BY pays.pays_code

UNION

SELECT
epci.libelle_epci as libelle_geo,
sum(epls.logtot2010) as log_tot_10

FROM
meddtl.epls
JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
JOIN tables_de_references.epci ON commune.epci=epci.code_insee_epci
GROUP BY epci.code_insee_epci) as complet

ORDER BY libelle_geo;

Dernière modification par luern (Mon 29 July 2013 15:42)


Paul Hedin

ex-luern

Hors ligne

 

#25 Tue 30 July 2013 10:39

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3943

Re: Question : liaison table postgres

Bonjour,
Une piste peut-être : Pourquoi ne pas rajouter un champ statut par ex (1 pour commune, 2 epci, 3 pays) et faire un order by statut, libelle_geo? Ça donnerait un truc du genre (pas testé du tout)

Code:

SELECT libelle_geo,log_tot_10, statut
FROM(

SELECT
commune.libelle_commune as libelle_geo,
sum(epls.logtot2010) as log_tot_10,
1 as statut

FROM
meddtl.epls
JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
JOIN tables_de_references.epci ON commune.epci=epci.code_insee_epci
GROUP BY commune.codgeo

UNION

SELECT
pays.libelle_pays as libelle_geo,
sum(epls.logtot2010) as log_tot_10,
3 as statut

FROM
meddtl.epls
JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
JOIN tables_de_references.pays ON commune.pays=pays.pays_code
GROUP BY pays.pays_code

UNION

SELECT
epci.libelle_epci as libelle_geo,
sum(epls.logtot2010) as log_tot_10,
2 as statut

FROM
meddtl.epls
JOIN tables_de_references.commune ON meddtl.epls.codgeo = commune.codgeo
JOIN tables_de_references.epci ON commune.epci=epci.code_insee_epci
GROUP BY epci.code_insee_epci) as complet

ORDER BY statut, libelle_geo;

Hors ligne

 

#26 Tue 30 July 2013 11:38

PaulH
Participant assidu
Lieu: Nantes
Date d'inscription: 1 Aug 2007
Messages: 463

Re: Question : liaison table postgres

Disons que j'aimerais éviter parce qu'on rentre dans de la bidouille un peu smile. Mais je te remercie pour cette piste.Merci


Paul Hedin

ex-luern

Hors ligne

 

#27 Tue 30 July 2013 12:10

ppluvinet
Participant assidu
Lieu: VALENCE
Date d'inscription: 6 Aug 2007
Messages: 617

Re: Question : liaison table postgres

Bonjour,
à la lecture de ce que propose SANTANNA, ca ne me semble pas vraiment de la bidouille. Je me trompe peut-être...
Bonne journée...


Pascal PLUVINET

Hors ligne

 

#28 Tue 30 July 2013 14:58

PaulH
Participant assidu
Lieu: Nantes
Date d'inscription: 1 Aug 2007
Messages: 463

Re: Question : liaison table postgres

J'ai essayé et ça marche!
Je crois que je vais garder cette solution ! merci


Paul Hedin

ex-luern

Hors ligne

 

Pied de page des forums

Powered by FluxBB