You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Pour chaque commune, on souhaite calculer la somme des surfaces intersectées par chaque type de zone. On doit donc utiliser toutes les tables de zonage (ici seulement 2 tables, mais c'est possible d'en ajouter)
(SELECTsum(ST_Area(ST_Intersection(c.geom, p.geom)) /10000 ) FROMz_formation.parc_nationalAS p WHERE ST_Intersects(p.geom, c.geom) ) AS surface_parc_national,
445
+
(SELECTsum(ST_Area(ST_Intersection(c.geom, p.geom)) /10000 ) FROMz_formation.znieffAS p WHERE ST_Intersects(p.geom, c.geom) ) AS surface_znieff
446
+
FROMz_formation.communeAS c
447
+
ORDER BYc.nom
448
+
```
449
+
427
450
* Méthode avec des **jointures LEFT**
428
451
429
452
```sql
@@ -455,32 +478,17 @@ GROUP BY c.id_commune, c.code_insee, c.nom
455
478
ORDER BYc.nom
456
479
```
457
480
458
-
**Avantage**: on peut intégrer facilement dans la clause WHERE des conditions sur les champs des tables jointes. Par exemple ne récupérer que les lignes qui sont concernées par un parc ou une znieff, via `WHERE p.id IS NOT NULL OR z.id IS NOT NULL` (commenté ci-dessus pour le désactiver)
* on peut intégrer facilement dans la clause WHERE des conditions sur les champs des tables jointes. Par exemple ne récupérer que les lignes qui sont concernées par un parc ou une znieff, via `WHERE p.id IS NOT NULL OR z.id IS NOT NULL` (commenté ci-dessus pour le désactiver)
484
+
* On peut sortir plusieurs aggrégats pour les tables jointes. Par exemple un décompte des parcs, un décompte des znieff
469
485
486
+
ATTENTION:
470
487
471
-
* Méthode avec des sous-requêtes
488
+
* on peut avoir des doublons qui vont créer des erreurs. Voir cet exemple: http://sqlfiddle.com/#!17/73485c/2/0
489
+
* cette méthode peut poser des soucis de performance
472
490
473
-
```sql
474
-
SELECT
475
-
c.id_commune, c.code_insee, c.nom,
476
-
ST_Area(c.geom) /10000AS surface_commune_ha,
477
-
(SELECTsum(ST_Area(ST_Intersection(c.geom, p.geom)) /10000 ) FROMz_formation.parc_nationalAS p WHERE ST_Intersects(p.geom, c.geom) ) AS surface_parc_national,
478
-
(SELECTsum(ST_Area(ST_Intersection(c.geom, p.geom)) /10000 ) FROMz_formation.znieffAS p WHERE ST_Intersects(p.geom, c.geom) ) AS surface_znieff
479
-
FROMz_formation.communeAS c
480
-
ORDER BYc.nom
481
-
```
482
491
483
-
Avantage: plus simple à écrire, mais ne permet pas de clause WHERE simple
0 commit comments