#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
#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
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 !!!
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
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 . 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