Bonjour,
Avant toutes choses, je vous demande pardon si j'emploie des termes inappropriés (qui peuvent d'ailleurs porter à confusion...), mais je ne suis pas spécialiste de l'univers SQL (et des bases de données en général en fait...). En revanche, je suis intéressé par ce domaine (dans lequel il faudrait vraiment que je me plonge sérieusement parce que ce que j'ai pu entrevoir permettrait de gagner pas mal de temps dans mon travail) et j'aurais voulu avoir votre avis sur une requête que j'ai élaborée.
Pour planter le décors, je suis urbaniste et je cherche à faire le lien entre un jeu de données MAJIC et un cadastre EDIGEO.
Niveau logiciel, j'utilise principalement QGIS pour la partie géographique (et notamment avec le plugin cadastre qui permet d'importer les fichiers MAJIC ainsi que les cadastres EDIGEO dans une base de données Postgis), et j'ai également installé PostgreSQL 11.2 ainsi que PostGIS 2.5.1.
Voici mon besoin : Je souhaite utiliser les relations existant entre les différentes tables composant les données MAJIC afin de rassembler les informations correspondant aux noms des propriétaires pour chaque parcelle ainsi que la présence (ou non) de locaux vacants et, le cas échéant, leur nombre, leur type, et leur niveau d'entretien.
Afin que ce soit simple à utiliser par la suite je me suis dit que j'allais faire une seule et unique requête, mais ça rame pas mal et je me demande si, d'une, la rédaction de la requête est bonne (comme je ne connais pas le langage SQL, j'ai essayé de rassembler différentes choses que j'ai pus trouver sur internet mais j'ai le sentiment que ça pourrait être optimisé), ou s'il ne vaut mieux pas passer par des "tables temporaires" afin d'alléger un peu les traitements et limiter la quantité de donnée placée en mémoire tampon...
Pour info, voici la requête que j'ai tentée :
J'ai essayé d'annoter un peu tout ça pour m'y retrouver le jour où je reviendrais dessus (parce que je n'en traite pas tous les jours non plus de ces fichiers-là) et ça m'a permis de voir quelque incohérences aussi...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 SELECT -- Liste des champs à récupérer dans ma table "parcelle".parcelle, -- Indispensable pou faire une jointure sur QGIS "parcelle".ccodep AS dept, "parcelle".ccocom AS com, "parcelle".comptecommunal, "parcelle".voie AS id_voie, "parcelle".dvoilib AS voie, count("proprietaire".proprietaire) AS nb_prop, -- Utile pour identifier les terrains régimes de propriété particuliers string_agg("proprietaire".proprietaire , ', ') AS proprietaire, string_agg("proprietaire".ccodro, ', ') AS ccodro, string_agg("proprietaire".gdesip , ', ') AS gdesip, string_agg("proprietaire".gtoper, ', ')AS gtoper, max("proprietaire".dnatpr) AS dnatpr, max("proprietaire".ccogrm) AS ccogrm, max("proprietaire".dsglpm) AS dsglpm, max("proprietaire".dforme) AS dforme, max("proprietaire".dformjur) AS dformjur, string_agg("proprietaire".ddenom, ', ') AS ddenom, -- Concaténation du (des) nom(s) de propriétaire(s) max("proprietaire".dlign6) AS dlign6, max("proprietaire".dlign5) AS dlign5, max("proprietaire".dsiren) AS dsiren, string_agg("proprietaire".dnomus, ', ') AS dnomus, string_agg("proprietaire".dprnus, ', ') AS dprnus, max("temp1".local10), max("temp1".invar), max("temp1".pev), string_agg("temp1".ccoaff, ', '), -- Usage du local (logement, commerce, artisanat,...) string_agg(CAST ("temp1".dcetlc AS TEXT), ', '), -- Entretien du local max("temp1".ccthp), -- Type d'occupation du local (vacant,...) count("temp1".ccthp), -- Une fois agrégé, permet de connaître le nombre de logements vacants par parcelle avg("temp1".dvltpe) FROM "majic_2018"."parcelle", "majic_2018"."proprietaire", -- Ces parcelles ont une relation directe : comptecommunal (SELECT "local10".parcelle, "local10".local10, "local10".ccodep AS dept, "local10".ccocom AS com, "local10".invar, "pev".pev, "pev".ccoaff, "pev".dcetlc, "pev".ccthp, "pev".dvltpe FROM "majic_2018"."local10", -- Pas de relation directe de "pev" à "parcelle", donc je dois passer par "local10" "majic_2018"."pev" WHERE "local10".local10 = "pev".local10 AND "pev".ccthp = 'V' -- J'en profite pour ne garder que les locaux vacants ) "temp1" WHERE ("parcelle".comptecommunal = "proprietaire".comptecommunal) OR ("temp1".parcelle = "parcelle".parcelle) GROUP BY "parcelle".parcelle ;
Pour info, là je n'ai fait que la requête, mais je dois encore ajouter la commande pour créer une table à partir de cette requête, mais ça ne semble pas trop compliqué d'après ce que j'ai vu (j'espère...).
Donc si vous avez des conseils, astuces, ou autres informations qui pourraient m'aider dans ma quête de la requête simple et efficace, je suis preneur ! D'avance merci pour vos lumières !
Partager