Skip to content

Commit 59001d8

Browse files
committed
Improve JOIN chapter
1 parent c97e8d5 commit 59001d8

File tree

1 file changed

+29
-21
lines changed

1 file changed

+29
-21
lines changed

docs/join_data.md

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,29 @@ SELECT pg_catalog.setval('z_formation.znieff_id_seq', 5, true);
424424

425425
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)
426426

427+
Résultat attendu:
428+
429+
| id_commune | code_insee | nom | surface_commune_ha | somme_surface_parcs | somme_surface_znieff |
430+
|------------|------------|-------------------|--------------------|---------------------|----------------------|
431+
| 1139 | 27042 | Barville | 275.138028733401 | 87.2237204013011 | None |
432+
| 410 | 27057 | Bernienville | 779.74546553394 | None | 5.26504189468878 |
433+
| 1193 | 27061 | Berthouville | 757.19696570046 | 19.9975421896336 | None |
434+
| 495 | 27074 | Boisney | 576.995877227961 | 0.107059260396721 | None |
435+
| 432 | 27077 | Boissey-le-Châtel | 438.373848703835 | 434.510197417769 | 83.9289621127432 |
436+
437+
438+
* Méthode avec des sous-requêtes
439+
440+
```sql
441+
SELECT
442+
c.id_commune, c.code_insee, c.nom,
443+
ST_Area(c.geom) / 10000 AS surface_commune_ha,
444+
(SELECT sum(ST_Area(ST_Intersection(c.geom, p.geom)) / 10000 ) FROM z_formation.parc_national AS p WHERE ST_Intersects(p.geom, c.geom) ) AS surface_parc_national,
445+
(SELECT sum(ST_Area(ST_Intersection(c.geom, p.geom)) / 10000 ) FROM z_formation.znieff AS p WHERE ST_Intersects(p.geom, c.geom) ) AS surface_znieff
446+
FROM z_formation.commune AS c
447+
ORDER BY c.nom
448+
```
449+
427450
* Méthode avec des **jointures LEFT**
428451

429452
```sql
@@ -455,32 +478,17 @@ GROUP BY c.id_commune, c.code_insee, c.nom
455478
ORDER BY c.nom
456479
```
457480

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)
459-
460-
Résultat:
481+
**Avantages**:
461482

462-
| id_commune | code_insee | nom | surface_commune_ha | somme_surface_parcs | somme_surface_znieff |
463-
|------------|------------|-------------------|--------------------|---------------------|----------------------|
464-
| 1139 | 27042 | Barville | 275.138028733401 | 87.2237204013011 | None |
465-
| 410 | 27057 | Bernienville | 779.74546553394 | None | 5.26504189468878 |
466-
| 1193 | 27061 | Berthouville | 757.19696570046 | 19.9975421896336 | None |
467-
| 495 | 27074 | Boisney | 576.995877227961 | 0.107059260396721 | None |
468-
| 432 | 27077 | Boissey-le-Châtel | 438.373848703835 | 434.510197417769 | 83.9289621127432 |
483+
* 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
469485

486+
ATTENTION:
470487

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
472490

473-
```sql
474-
SELECT
475-
c.id_commune, c.code_insee, c.nom,
476-
ST_Area(c.geom) / 10000 AS surface_commune_ha,
477-
(SELECT sum(ST_Area(ST_Intersection(c.geom, p.geom)) / 10000 ) FROM z_formation.parc_national AS p WHERE ST_Intersects(p.geom, c.geom) ) AS surface_parc_national,
478-
(SELECT sum(ST_Area(ST_Intersection(c.geom, p.geom)) / 10000 ) FROM z_formation.znieff AS p WHERE ST_Intersects(p.geom, c.geom) ) AS surface_znieff
479-
FROM z_formation.commune AS c
480-
ORDER BY c.nom
481-
```
482491

483-
Avantage: plus simple à écrire, mais ne permet pas de clause WHERE simple
484492

485493

486494
**ATTENTION**:

0 commit comments

Comments
 (0)