Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Tue 12 December 2017 13:41

V.LEONARD38
Participant occasionnel
Date d'inscription: 18 Jan 2016
Messages: 18

QGIS / Bdmanager: Constructeur De Requete

Bonjour,

Je rencontre un problème avec le constructeur de requête. Je ne maîtrise pas bien le langage SQL, du coup je ne parviens pas à le résoudre.

J'ai fait une requête qui me permet de faire une jointure spatiale entre une couche polygone (une couche buffer) et une couche de points, afin d'affecter une information de la couche de point sur la couche buffer (à un point correspond un buffer)

Elle se présente comme ceci :

Code:

SELECT "Buffer"."Buffer_id",
"Buffer"."Buffer_Id2",
"Points"."code_1",
"Points."code_2" 

FROM "Point","Buffer"
WHERE ST_Intersects("Point"."geometry","Buffer"."geometry")

Cette requête fonctionne très bien. Mais la couche Points comporte moins d'entités que la couche buffer.
Pour affecter un code_1/code_2 à tous les buffer, il me faut effectuer la même opération avec d'autres couches de point (appellons-les Points_2 et Points_3).

J'ai donc tenté de construire une requête qui fasse cette opération en une seule fois mais je ne parviens pas à en construire une qui fonctionne de par mon manque de connaissance du SQL. Je vous liste mes différentes tentatives :

- 1ere tentative :

Code:

SELECT "Buffer"."Buffer_id",
"Buffer"."Buffer_Id2",
"Points"."code_1",
"Points"."code_2",
"Points_2"."code_1",
"Points_2"."code_2",
"Points_3"."code_1",
"Points_3"."code_2",

 
FROM "Points","Points_2","Points_3","Buffer", 
WHERE ST_Intersects ("Points"."geometry","Buffer"."geometry") OR (ST_Intersects ("Points_2"."geometry","Buffer"."geometry") OR ST_Intersects ("Points_3"."geometry","Buffer"."geometry")

- 2eme tentative :

Code:

SELECT "Buffer"."Buffer_id",
"Buffer"."Buffer_Id2",
"Points"."code_1",
"Points"."code_2",
"Points_2"."code_1",
"Points_2"."code_2",
"Points_3"."code_1",
"Points_3"."code_2",

 
FROM "Points","Points_2","Points_3","Buffer", 
WHERE (ST_Intersects ("Points"."geometry","Buffer"."geometry") OR (ST_Intersects ("Points_2"."geometry","Buffer"."geometry") OR ST_Intersects ("Points_3"."geometry","Buffer"."geometry"))

3eme tentative :


Code:

SELECT "Buffer"."Buffer_id",
"Buffer"."Buffer_Id2",
"Points"."code_1",
"Points"."code_2",
"Points_2"."code_1",
"Points_2"."code_2",
"Points_3"."code_1",
"Points_3"."code_2",

 
FROM "Points","Points_2","Points_3","Buffer", 
WHERE ST_Intersects (("Points"."geometry","Buffer"."geometry") OR ("Points_2"."geometry","Buffer"."geometry") OR ("Points_3"."geometry","Buffer"."geometry"))

A chaque tentative me revient cette erreur :

Code:

Query execution error on CREATE TEMP VIEW _tview AS SELECT "Buffer"."Buffer_id",
"Buffer"."Buffer_Id2",
"Points"."code_1",
"Points"."code_2",
"Points_2"."code_1",
"Points_2"."code_2",
"Points_3"."code_1",
"Points_3"."code_2",

 
FROM "Points","Points_2","Points_3","Buffer", 
WHERE ST_Intersects (("Points"."geometry","Buffer"."geometry") OR ("Points_2"."geometry","Buffer"."geometry") OR ("Points_3"."geometry","Buffer"."geometry"))

Y'a t'il une formulation correcte pour effectuer cette opération (si c'est possible).

En vous remerciant,

Valentin

Dernière modification par V.LEONARD38 (Tue 12 December 2017 13:46)

Hors ligne

 

#2 Tue 12 December 2017 14:18

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1132

Re: QGIS / Bdmanager: Constructeur De Requete

Salut,

votre requête devrait s'écrire avec des OUTER JOINS

Code:

SELECT buffer_id,
point1.code code1,
point2.code code2
FROM buffer
LEFT OUTER JOIN point1 ON st_intersects(buffer.geom, point1.geom)
LEFT OUTER JOIN point2 ON point1.id IS NULL AND st_intersects(buffer.geom, point2.geom)
etc..
.
.
.

Une jointure externe, ici gauche, entre deux ensembles produit l'union
des éléments de l'ensemble se trouvant à gauche de la jointure
n'ayant pas de relation avec l'ensemble de droite,
ainsi que chaque combinaison issue des relations trouvées.
Les colonnes de l'ensemble de droite des éléments n'ayant pas trouvé de correspondance
ont comme valeur la valeur nulle.

Comme disait quelqu'un que je connais un petit dessin vaut mieux qu'un grand discours
https://fr.wikipedia.org/wiki/Jointure_(informatique)

Dernière modification par tumasgiu (Tue 12 December 2017 15:46)

Hors ligne

 

#3 Thu 14 December 2017 15:10

V.LEONARD38
Participant occasionnel
Date d'inscription: 18 Jan 2016
Messages: 18

Re: QGIS / Bdmanager: Constructeur De Requete

Bonjour,

Merci pour votre réponse.
Je n'ai, en ce moment, pas le temps de tester votre solution. Probablement la semaine prochaine. mais merci du coup de main !

Cordialement,

Valentin

Dernière modification par V.LEONARD38 (Thu 14 December 2017 15:11)

Hors ligne

 

Pied de page des forums

Powered by FluxBB