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
    Candidat au Club
    Femme Profil pro
    Sigiste
    Inscrit en
    février 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Sigiste

    Informations forums :
    Inscription : février 2017
    Messages : 4
    Points : 2
    Points
    2
    Par défaut 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 actif
    Homme Profil pro
    developpeur sql et scripting
    Inscrit en
    août 2014
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : developpeur sql et scripting
    Secteur : Santé

    Informations forums :
    Inscription : août 2014
    Messages : 171
    Points : 286
    Points
    286
    Par défaut
    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
    Avatar de SQLpro
    Homme Profil pro
    YYYY
    Inscrit en
    mai 2002
    Messages
    19 231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : YYYY
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 19 231
    Points : 45 458
    Points
    45 458
    Par défaut
    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 +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

  4. #4
    Candidat au Club
    Femme Profil pro
    Sigiste
    Inscrit en
    février 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Sigiste

    Informations forums :
    Inscription : février 2017
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    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.

Discussions similaires

  1. Pb requête imbriquée
    Par ddams dans le forum Requêtes
    Réponses: 11
    Dernier message: 20/04/2004, 13h13
  2. [Requête] Faire une requête imbriquée?
    Par sekiryou dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2004, 23h52
  3. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 11h29
  4. Requêtes imbriquées ?
    Par Ph. B. dans le forum XMLRAD
    Réponses: 7
    Dernier message: 06/05/2003, 14h19
  5. Requête imbriquée et indexes INTERBASE
    Par vadim dans le forum InterBase
    Réponses: 2
    Dernier message: 06/09/2002, 17h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo