Pages: 1
- Sujet précédent - intersection entre 3 tables : comportement incomprensible - Sujet suivant
#1 Wed 12 August 2009 19:57
intersection entre 3 tables : comportement incomprensible
Bonsoir,
peut-être est-ce dû à la fatigue mais je cale sur une requête d'intersection dont je ne m'explique pas le résultat :
je souhaite compter le nombre de ZNIEFF qui sont en Lozère mais qui ne sont pas sur le territoire du Parc National des Cévennes.
J'utilise pour cela 3 tables : version_perimetre_znieff_gen_2, perimetre et departement
et une requête d'intersection :
Code:
select count(distinct znieff_gen_2_id_znieff) from version_perimetre_znieff_gen_2 JOIN departement ON st_intersects(departement.geometrie, version_perimetre_znieff_gen_2.geometrie) JOIN perimetre ON st_intersects(perimetre.geometrie, version_perimetre_znieff_gen_2.geometrie) is false WHERE departement.num_insee='48' AND type_perimetre like '%pnc%'
Le résultat de cette requête est 126 et est faux
En effet, j'ai 151 ZNIEFF en LOZERE :
Code:
select count(distinct znieff_gen_2_id_znieff) from version_perimetre_znieff_gen_2 JOIN departement ON st_intersects(departement.geometrie, version_perimetre_znieff_gen_2.geometrie) where departement.num_insee='48'
Et 80 ZNIEFF en Lozère qui sont sur le territoire du parc :
Code:
select count(distinct znieff_gen_2_id_znieff) from version_perimetre_znieff_gen_2 JOIN departement ON st_intersects(departement.geometrie, version_perimetre_znieff_gen_2.geometrie) JOIN perimetre ON st_intersects(perimetre.geometrie, version_perimetre_znieff_gen_2.geometrie) where departement.num_insee='48' AND type_perimetre like '%pnc%'
Le résultat que j'attends de ma première requête est 71 (80+71=151).
Or la seule syntaxe qui me permette d'avoir ce bon résultat utilise une sous requete :
Code:
select count(distinct znieff_gen_2_id_znieff) from version_perimetre_znieff_gen_2 JOIN departement ON st_intersects(departement.geometrie, version_perimetre_znieff_gen_2.geometrie) where departement.num_insee='48' AND znieff_gen_2_id_znieff NOT IN ( select znieff_gen_2_id_znieff from version_perimetre_znieff_gen_2 JOIN perimetre ON st_intersects(perimetre.geometrie, version_perimetre_znieff_gen_2.geometrie) where type_perimetre like '%pnc%')
Comprenez vous ce comportement ? je décortique le problème depuis 2 bonnes heures mais je ne vois pas le début d'une explication.
Merci d'avance,
Mathieu Bossaert
Dernière modification par Mathieu BOSSAERT (Fri 14 August 2009 11:46)
Mathieu BOSSAERT
Association GeoRezo
Hors ligne
#2 Fri 14 August 2009 10:56
Re: intersection entre 3 tables : comportement incomprensible
Bonjour,
j'ai compris l'origine du problème :
j'ai deux objets de type 'pnc' : la zone centrale et la zone périphérique.
Considérons une znieff complétement incluse dans la zone centrale, lors de la requête, l'intersection avec la zone périphérique sera fausse et la znieff sera comptée.
Mon résultat (126) contenait donc toutes les ZNIEFF de Lozère (151) sauf celles qui sont à la fois sur la zone centrale et sur la zone périphérique du Parc (25).
La solution est de travailler avec l'union des objets de même type dans ma table perimetre :
Code:
select count( znieff_gen_2_id_znieff) from version_perimetre_znieff_gen_2 JOIN departement ON st_intersects(departement.geometrie, version_perimetre_znieff_gen_2.geometrie) JOIN (select st_union(geometrie) as geometrie FROM perimetre where type_perimetre like '%pnc%' ) perimetre ON st_intersects(perimetre.geometrie, version_perimetre_znieff_gen_2.geometrie) is false WHERE departement.num_insee='48'
Le "count( distinct )" n'aidait pas à y voir claire et mes neurones manquent un peu de peps en ce moment...
L'affichage des znieff résultant de la requête m'a bien aidait à comprendre le soucis!
Dernière modification par Mathieu BOSSAERT (Fri 14 August 2009 12:06)
Mathieu BOSSAERT
Association GeoRezo
Hors ligne
Pages: 1
- Sujet précédent - intersection entre 3 tables : comportement incomprensible - Sujet suivant