IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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
    Femme Profil pro
    Sigiste
    Inscrit en
    Février 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Sigiste

    Informations forums :
    Inscription : Février 2017
    Messages : 7
    Points : 6
    Points
    6
    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 averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 257
    Points : 395
    Points
    395
    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
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    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...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Sigiste
    Inscrit en
    Février 2017
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Sigiste

    Informations forums :
    Inscription : Février 2017
    Messages : 7
    Points : 6
    Points
    6
    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, 12h13
  2. [Requête] Faire une requête imbriquée?
    Par sekiryou dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/01/2004, 22h52
  3. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29
  4. Requêtes imbriquées ?
    Par Ph. B. dans le forum XMLRAD
    Réponses: 7
    Dernier message: 06/05/2003, 13h19
  5. Requête imbriquée et indexes INTERBASE
    Par vadim dans le forum InterBase
    Réponses: 2
    Dernier message: 06/09/2002, 16h15

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