Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes PostgreSQL Discussion :

Requête imbriquée - Postgresql-Postgis


Sujet :

Requêtes PostgreSQL

  1. #1
    Futur Membre du Club
    Requête imbriquée - Postgresql-Postgis
    Bonjour à tous

    Débutant sur Postgresql et l'utilisant principalement pour du SIG, je fais quelques trigger mais qui restent assez simples (ajout de valeur par rapport à une autre table géométrique lors de la création d'une nouvelle entité, etc. ).

    J'aimerai pouvoir faire une requête un peu plus complexe mais je ne sais pas comment la construire.

    J'ai 6 tables:
    - Point A
    - Point B
    - Polygone 1
    - Polygone 2
    - Polygone 3
    - Ligne

    Le polygone 1 englobe le 2 et le 3, et le polygone 2 englobe le 3.

    Je souhaiterais faire la requête suivante:
    Si un point de la table Point A est crée et qu'il intersecte une ligne de la table Ligne et si la ligne est à l'intérieur de(s) polygone(s) 1, 2 , 3 alors les points de la table Point B situés à l'intérieur de(s) polygone(s) sont sélectionnés et enregistrés dans une nouvelle table.

    Merci d'avance pour votre aide!

  2. #2
    Membre averti
    Bonjour bonjour,

    Tout d'abord, ce n'est pas contre vous, mais en général, dans les cas comme ça, le nom des tables ne suffit pas spécialement, il faudrait le DDL (structure des tables) limité aux colonnes nécessaires (ou tout, comme il est le plus simple) et anonymisés si besoin.

    Petit plus : Un exemple de données pour chacune des tables (On demande pas 30 lignes) et du résultat voulu.
    Ici le résultat voulu étant une insertion venant d'un select, on aimerait donc un exemple de résultat du select (même si c'est potentiellement juste les coordonnés d'un point) en fonction de l'exemple des données.

    Bisous bisous

  3. #3
    Rédacteur

    Il faut utiliser un déclencheur et faire un
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    INSERT INTO NouvelleTable
    SELECT ...
    WHERE  EXISTS(SELECT * 
                  FROM new AS n 
                  WHERE EXISTS(SELECT * 
    			               FROM TableLigne AS TL 
    						   WHERE ST_Intersect(TL.ColGeo, n.AcolGeo) 
    						     AND EXISTS(SELECT * FROM (SELECT * FROM PolygoneA AS PA WHERE ST_Intersect(PA.ColGeo, TL.ColGeo)
    							                           UNION ALL 
    													   SELECT * FROM PolygoneB AS PA WHERE ST_Intersect(PB.ColGeo, TL.ColGeo)
    							                           UNION ALL 
    													   SELECT * FROM PolygoneC AS PA WHERE ST_Intersect(PC.ColGeo, TL.ColGeo)))))


    A +
    Cette signature n'a pas pu être affichée car elle comporte des erreurs.

  4. #4
    Futur Membre du Club
    SQLpro merci beaucoup pour votre réponse qui m'aide pas mal.

    Cependant en reprenant le code, les sélections entre la table ligne et polygones sont ok mais après ces sélections, je voudrais que ce soit les "id" des points B situés à l'intérieur de ces polygones (Z0, Z1, Z2) qui s’insèrent dans ma nouvelle table. A quel moment puis je utiliser st_within ?


    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
    BEGIN
    INSERT INTO "test"."Newtable"
    SELECT id FROM "test"."Point B"
    WHERE  EXISTS(SELECT * 
                  FROM "test"."Newtable" AS n
                  WHERE EXISTS(SELECT * 
    				FROM "test"."TableLigne" AS TL
    						   WHERE st_intersects(TL.geom, n.geom) 
    						     AND EXISTS(SELECT * FROM (SELECT * FROM "test"."zone0" AS Z0 WHERE st_intersects(Z0.geom, TL.geom)
    							                           UNION ALL 
    													   SELECT * FROM "test"."zone1" AS Z1 WHERE st_intersects(Z1.geom, TL.geom)
     
    						                                   UNION ALL 
    													   SELECT * FROM "test"."zone2" AS Z2 WHERE st_intersects(Z2.geom, TL.geom)) AS ZS)));
     
    RETURN NEW;
    END;


    Merci d'avance.

###raw>template_hook.ano_emploi###