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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Wed 27 September 2017 17:39

meonais
Participant occasionnel
Date d'inscription: 17 Jan 2017
Messages: 35

Aide sur requête recursive

Bonjour,

Je me forme petit à petit sur les requêtes postgresql/postgis (elles ne sont donc pas toujours optimisées...).

J'ai besoin d'attribuer des notes à des tronçons de cours d'eau en fonction de la note du tronçon situé directement en aval.

Je travaille avec une extraction de la bd carthage, correctement orientée et dont la topologie est vérifiée.

J'ai une couche de tronçons (env. 800 entités) constituée des champs suivants :   
  idsplit integer, (primary key)
  region_zone_hydro text,
  source integer,
  target integer,
  max numeric,
  classe numeric,
  classe_corr numeric ---> Champ à utiliser,
  geom geometry(LineString,2154)

J'ai une requête récursive qui me donne les chemins à partir de chaque tronçon (je l'ai récupérée, j'ai du mal encore à comprendre comment appliquer la récursivité en fonction des situations) :

Code:

DROP TABLE IF EXISTS recursi CASCADE;
CREATE TEMP TABLE recursi AS (
WITH RECURSIVE ordered_list(idsplit, source,depth, path, cycle) as (
    select idsplit, source,1 as depth, array[idsplit] as path, false as cycle
    from split
    UNION ALL
    select s.idsplit, s.source, ol.depth+1 as depth, path || s.idsplit as path, s.idsplit=ANY(path) as cycle
    from split s
    join ordered_list ol on ol.source = s.target
    where  not cycle 
    )
select ol.*, s.geom
from ordered_list ol
join split s
on s.idsplit = ol.idsplit
GROUP BY ol.idsplit, ol.source, ol.depth, ol.path, ol.cycle, s.geom
)
;

ce qui donne (extrait) :

Code:

idsplit    source    depth    path    cycle   geom (non copiée ici)
(...)
22    868    8    {29,28,27,26,25,24,23,22}    f
22    868    9    {15,14,28,27,26,25,24,23,22}    f
22    868    10    {16,15,14,28,27,26,25,24,23,22}    f
(...)
23    1136    7    {14,28,27,26,25,24,23}    f
23    1136    7    {29,28,27,26,25,24,23}    f
23    1136    8    {15,14,28,27,26,25,24,23}    f
(...)

Je souhaite donc que :
"si la valeur de "classe_corr" du tronçon amont (B) est inférieure à celle de son ou de ses tronçons en aval (A), alors le tronçon B prend (la plus grande) valeur de A".
Et ainsi de suite jusqu'à la fin de mon réseau hydrographique.

Je précise si besoin, que le réseau est orienté de l'aval vers l'amont.

Je me suppose qu'il faut de nouveau une requête WITH RECURSIVE mais comme je le disais plus haut, je n'arrive pas à visualiser la construction à adopter...


Pouvez-vous m'aider à construire cette partie de requête ?

Hors ligne

 

#2 Fri 29 September 2017 15:01

meonais
Participant occasionnel
Date d'inscription: 17 Jan 2017
Messages: 35

Re: Aide sur requête recursive

Bonjour à tous,


J'ai essayé de retravailler sur mon problème...


Je ne pense pas avoir été très limpide dans mon post précédent donc je vous donne en plus une image de ce que j'ai aujourd'hui et de ce que j'aimerais obtenir
[img]http://imageshack.com/a/img922/8581/w7qCZM.jpg[/img]

Je souhaite donc :
- que "si la valeur de "classe_corr" du tronçon amont (B/enfant) est inférieure à celle de son ou de ses tronçons en aval (A/parent), alors le tronçon B prend (la plus grande) valeur de A/parent".
Et ainsi de suite jusqu'à la fin de mon réseau hydrographique.
- la cerise sur le gâteau, ce serait d'avoir la classe 0 en aval (tronçon(s) "grands-parents") du premier tronçon parent (A le plus aval) si et seulement s'il n'y a aucune note aujourd'hui sur ces tronçons grands-parents ET qu'il existe un tronçon parent noté en amont ; sinon ça doit rester en classe "NULL"



J'ai tenté une requête récursive mais pour l'instant :
- soit elle ne me donne qu'une partie du résultat attendue (avec UNION): seuls quelques tronçons B (enfant) sont modifiés et je n'arrive pas à récupérer les valeurs initiales des tronçons A ou B (ceux qui doivent conserver la valeur initiale de class_corr car les conditions de case ne sont pas vérifiées) :

Code:

DROP TABLE IF EXISTS testok CASCADE;
CREATE TABLE testok AS (
WITH RECURSIVE montaison (idsplit, source, target, classe_corr) 
AS
   (SELECT DISTINCT idsplit, source, target, classe_corr 
    FROM   testsum
    WHERE  testsum.source NOT IN (SELECT target FROM testsum)
    UNION  
    SELECT enfant.idsplit, enfant.source, parent.target,
    (CASE 
        WHEN (parent.classe_corr > enfant.classe_corr) THEN parent.classe_corr    
        WHEN (parent.classe_corr < enfant.classe_corr) THEN enfant.classe_corr
        WHEN (parent.classe_corr IS NULL) THEN 0
        ELSE enfant.classe_corr
    END) 
    FROM   testsum AS enfant
           INNER JOIN montaison AS parent
                 ON parent.target = enfant.source
                )
SELECT s.idsplit, s.source, s.target, s.max, s.classe, s.classe_corr, m.idsplit as enfantidsplit, m.source as enfantsource, m.target as parenttarget, m.classe_corr as classang_franchi, s.region_zone_hydro, s.geom
FROM   testsum s
LEFT OUTER JOIN montaison m
ON s.idsplit = m.idsplit

)

- soit elle tourne longtemps et/ou j'ai un message d'erreur (avec UNION ALL) :

Code:

DROP TABLE IF EXISTS testok CASCADE;
CREATE TABLE testok AS (
WITH RECURSIVE montaison (idsplit, source, target, classe_corr) 
AS
   (SELECT DISTINCT idsplit, source, target, classe_corr 
    FROM   testsum
    WHERE  testsum.source NOT IN (SELECT target FROM testsum)
    UNION  ALL
    SELECT enfant.idsplit, enfant.source, parent.target,
    (CASE 
        WHEN (parent.classe_corr > enfant.classe_corr) THEN parent.classe_corr    
        WHEN (parent.classe_corr < enfant.classe_corr) THEN enfant.classe_corr
        WHEN (parent.classe_corr IS NULL) THEN 0
        ELSE enfant.classe_corr
    END) 
    FROM   testsum AS enfant
           INNER JOIN montaison AS parent
                 ON parent.target = enfant.source
                )
SELECT s.idsplit, s.source, s.target, s.max, s.classe, s.classe_corr, m.idsplit as enfantidsplit, m.source as enfantsource, m.target as parenttarget, m.classe_corr as classang_franchi, s.region_zone_hydro, s.geom
FROM   testsum s
LEFT OUTER JOIN montaison m
ON s.idsplit = m.idsplit

)

le message d'erreur :

ERREUR: n'a pas pu étendre le fichier « base/72185/80520677.67 » : No space left on device
État SQL :53100
Astuce : Vérifiez l'espace disque disponible.


Je précise que tout est en local, sur un ordinateur portable...
Pstgresql 9.5 et postgis 2.3.2

Auriez-vous une idée pour m'aiguiller dans cette requête récursive ?

Merci d'avance !

Hors ligne

 

#3 Sun 01 October 2017 13:16

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

Re: Aide sur requête recursive

Salut,


J'ai fait un fiddle qui je pense fait le travail :

http://sqlfiddle.com/#!17/53864/4

Elle suppose que le réseau soit acyclique.

L'idée c'est d'ordonner les tronçons par profondeur croissante,
et de mettre à jour par groupe de profondeur, de façon à garantir
l'ordre topologique de la mise à jour, c'est à dire qu'on est sur de mettre à jour
un tronçon une fois que tout ses tronçons parents sont mis à jour.

Une fonction est utilisée car il n'est pas possible d'ordonner une instruction UPDATE.

Je ne pense pas que la méthode soit optimale et qu'elle supporte la mise à l'échelle.

Dernière modification par tumasgiu (Mon 02 October 2017 21:59)

Hors ligne

 

#4 Mon 02 October 2017 16:13

meonais
Participant occasionnel
Date d'inscription: 17 Jan 2017
Messages: 35

Re: Aide sur requête recursive

Bonjour tumasgiu

Et merci beaucoup pour votre réponse.
Comme je vous le disais, je débute, surtout avec les récursives et... les fonctions. J'avais effectivement pensé à utiliser les maximums de profondeur mais n'arrivait pas à tourner tout ça correctement, pour que ce soit cyclique.

J'ai utilisé votre code, en l'adaptant (je pense) à mes données. En fin de requête j'ai donc ce code pour mettre à jour/corriger le champ classe_corr de la table testsum (ma couche de tronçons) :

Code:

DROP FUNCTION IF EXISTS pg_temp.upd(t text) CASCADE;
CREATE FUNCTION pg_temp.upd(t text) RETURNS VOID
AS $$ BEGIN EXECUTE 'UPDATE testsum t SET classe_corr = GREATEST(classe_corr, (SELECT max(classe_corr) FROM testsum  t2 WHERE t2.target = t.source)) WHERE t.idsplit IN (' || t || ' )'; END; $$
LANGUAGE plpgsql;


WITH 
RECURSIVE rec(depth, idsplit, s, e)
AS(
SELECT 0, t.idsplit, t.source , t.target FROM testsum t
LEFT JOIN testsum t2 
ON t.source = t2.target
WHERE t2.target IS NULL
UNION
SELECT depth + 1, t.idsplit, t.source, t.target
FROM rec
JOIN testsum t
ON rec.e = t.source
)
SELECT pg_temp.upd(string_agg(f.idsplit::text, ',')) 
FROM (SELECT max(depth) depth, idsplit FROM rec GROUP BY idsplit) f
WHERE depth > 0
GROUP BY depth
ORDER BY depth;

Je n'ai pas de bug annoncés mais je dois lancer la partie récursive plusieurs fois pour aboutir à mes fins ; c'est à dire pour que la modification des valeurs sur les tronçons "fils" se propage jusqu'au dernier.
En image, ça donne ça :

Premier lancement de la récursive après création de la fonction :
[img]http://imageshack.com/a/img923/8484/tjwsyU.jpg[/img]

Deuxième lancement de la récursive :
[img]http://imageshack.com/a/img923/6427/sIwZIY.jpg[/img]

Troisième lancement de la récursive :
[img]http://imageshack.com/a/img923/5183/tuucwm.jpg[/img]


etc.

J'ai testé, je peux arriver à mes fins mais en lançant une dizaine de fois la requête (je suppose que ça dépend du nombre d'entités tronçons et/ou de leurs connexions entre eux si j'ai bien analysé la requête).

Ai-je mal utilisé vos éléments ?
Est-ce lié à ce que vous appelez "mise à l'échelle" (je ne comprends pas trop votre expression dans ce contexte) ?


En vous remerciant de nouveau de votre aide !

Hors ligne

 

#5 Wed 04 October 2017 18:27

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

Re: Aide sur requête recursive

Quand je parlais de mise à l'échelle, je parlais de volume de donnée à traiter,
pas sur que les performances soient identique avec un jeu de dizaine de milliers de tronçons et beaucoup de connexions entre eux.
On dit couramment que la requête ne "scale", et on peut employer le néologisme scalabilité.
Mais j'aime bien employer des termes peu usités, çà me donne l'air intéressant.
https://fr.wikipedia.org/wiki/Scalability

l'adaptation de la requête a l'air correcte, et j'ai essayé de complexifier un peu
mes données test pour reproduire le bug sans succès.

Si vous pouviez me faire parvenir un échantillon de vos données
(typiquement celles que l'on voit sur votre capture d'écran),
que je puisse tester.
peut être y a-t'il un cas auquel je n'ai pas réfléchi.

Comment exécutez vous la requête ? psql ? pgadmin ? autre ?
C'est peut être une histoire d'isolation transactionnelle.

Dernière modification par tumasgiu (Wed 04 October 2017 19:05)

Hors ligne

 

#6 Wed 04 October 2017 19:17

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Aide sur requête recursive

Bonsoir:

le message d'erreur sur la récursive avec union all: attention: ca veut dire que la requete ne finit jamais et remplit tout le disque (no space left). Et ca, PG n'aime pas du tout.
Vérifiez que vous avez bien récupéré l'espace disque apres la fin de cette requete. (select pg_database_size('mabase')) et taille sur le disque.

Sinon, malgré les nouvelles explications, je ne suis pas sur de comprendre ce que vous voulez.
Les numéros sur les images correspondent aux id de troncon ou aux classes ?

Vous auriez un exemple écrit des troncons et attributs que vous voudriez, par ex sur 2 ou 3 troncons ?

Nicolas

Hors ligne

 

#7 Wed 04 October 2017 19:37

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

Re: Aide sur requête recursive

Nicolas a écrit:

le message d'erreur sur la récursive avec union all: attention: ca veut dire que la requete ne finit jamais et remplit tout le disque (no space left). Et ca, PG n'aime pas du tout.


Très juste, e n'ai pas pensé à le préciser. Pour se prémunir de ce genre de boulette, qui peuvent être assez embêtantes,
il est conseillé d'utiliser LIMIT dans la requête qui utilise la CTE récursive.

Dernière modification par tumasgiu (Wed 04 October 2017 19:37)

Hors ligne

 

#8 Wed 04 October 2017 19:42

meonais
Participant occasionnel
Date d'inscription: 17 Jan 2017
Messages: 35

Re: Aide sur requête recursive

Bonsoir tumasgiu et Nicolas,

Merci de votre retour.
Je n'ai pas la possibilité de vous transmettre des données ce soir, ce sera pour demain matin à la première (ou presque) heure !

@tumasgiu
- ..et ça donne l'occasion d'en apprendre encore plus à vos lecteurs big_smile cool
- j’exécute sous pgadminIII
- je vais chercher "isolation transactionnelle" !

@Nicolas
- oui, je me suis faite avoir plusieurs fois avec le union all mais toujours réussi à refaire tourner correctement après
- pour l'espace disque, je ne comprends pas trop ce que je fais :$ ni ce que j'ai fait : j'avais lancé (select pg_database_size('mabase')) en changeant le nom de la base et ça m'avait donné un nombre à quelques chiffres mais maintenant :

Code:

ERREUR:  n'a pas pu tester le fichier « base/72185/42736700 » : Permission denied

- les numéros sur les premières images sont les id de tronçons, désolée d'avoir laissé trainer ça. Les classes sont seulement illustrées par les couleurs
- pour l'exemple écrit, la transmission demain d'une partie des données, ça ira ?

Merci encore,
Bonne soirée

Hors ligne

 

#9 Thu 05 October 2017 10:20

meonais
Participant occasionnel
Date d'inscription: 17 Jan 2017
Messages: 35

Re: Aide sur requête recursive

Bonjour,

J'ai passé une partie de la matinée à tester de nouveau tout ça, sans plus de résultats.

Pour mieux contextualiser je vous redonne les grandes étapes du travail réalisé, avec un schéma qui tente de les expliquer :
- 1/ j'ai utiliser la bdcarthage pour obtenir mon linéaire de cours d'eau.
- 2/ J'ai "découpé" mon cours d'eau par des points qui ont chacun une valeur.
- 3/ J'attribue ensuite la valeur cumulée des points aux tronçons découpés, de l'aval à l'amont ( voir (A) sur le schéma)
- 4/ J'attribue une classe à ces tronçons, en fonction de la valeur obtenue par le cumul de l'aval à l'amont ( voir seconde partie du schéma)
- 5/ Je pondère la classe de ces tronçons en fonction de la valeur brute de chaque point directement en aval du tronçon ( voir seconde partie du schéma)
- 6/ Je souhaite maintenant "propager" vers l'amont cette nouvelle classe ( voir seconde partie du schéma)
[img]http://imageshack.com/a/img924/1202/so2bRt.jpg[/img]


Je vous joins la couche sur laquelle je souhaiterais appliquer la récursive qui propage cette nouvelle classe vers l'amont

Cette couche se compose des champs suivants, avec quelques informations sur l'historique de requête

id integer,
region_zone_hydro text,
idsplit integer,  -- identifiant du tronçon
source integer, -- voir ci-dessous
target integer,-- obtenus avec le code :

Code:

DROP EXTENSION IF EXISTS pgrouting  CASCADE;
CREATE EXTENSION pgrouting;

alter table splitang add column source integer;
alter table splitang add column target integer;

select pgr_createTopology('splitang', 0.1, the_geom:='geom', id:='idsplit', source:='source', target:='target');

DROP TABLE IF EXISTS splitang_vertices_pgr CASCADE;
select pgr_createVerticesTable('splitang',  the_geom:='geom', source:='source', target:='target');

  max numeric, -- est la valeur du tronçon = étape 3/ du descriptif ci-dessus, ou (A) du schéma

classe numeric, -- de 0 (poids sans impact) à 6 (poids très impactant) en fonction de la valeur du tronçon (max)  = étape 4/

classe_corr numeric, -- pondération des tronçons en deux temps :
-- --- 1/correction éventuelle de la classe du tronçon en fonction de la valeur d'un point situé exactement au niveau de la source du tronçon (à l'aval pour mon cas) = étape 5/
-- --- 2/ propagation de la nouvelle classe de l'aval à l'amont = étape 6


geom geometry(LineString,2154)


Voilà.... J'espère avoir été plus plus claire...
Sinon, n'hésitez pas !
Merci


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#10 Thu 05 October 2017 15:51

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

Re: Aide sur requête recursive

Salut,

j'ai pu testé de mon coté avec votre échantillon,
et je n'arrive pas au problème que vous évoquez.

Donc j'en déduis que comme Nicolas, je n'ai pas réellement compris
ce que vous vouliez.

pré-conditions de la requête:
Les tronçons sont tous connectés.
la valeur source d'un tronçon est égale à la valeur target
des tronçons connectés en aval.
Pas de boucle dans le réseau.

Ce que la requête fait :
Mise à jour de classe_cor de tout les tronçons avec la valeur maximum des
tronçons connectés en aval, si celle ci est  supérieure à la valeur de classe_cor,
en respectant l'ordre topologique.

Post-conditions:
Chaque tronçon a une valeur classe_cor supérieure ou égale à celles de ses connections en aval,
soit :

Code:

SELECT NOT EXISTS(
    SELECT t.idsplit, t2.idsplit, t.classe_cor, t2.classe_cor 
    FROM test.meonais t 
    JOIN test.meonais t2
    ON t2.target = t.source 
    WHERE t.classe_cor < t2.classe_cor);
-- doit renvoyer vrai

Dernière modification par tumasgiu (Thu 05 October 2017 16:55)

Hors ligne

 

#11 Mon 09 October 2017 11:04

meonais
Participant occasionnel
Date d'inscription: 17 Jan 2017
Messages: 35

Re: Aide sur requête recursive

Bonjour tumasgiu,
Bonjour Nicolas

Je vous remercie pour vos réponses.

J'ai passé quelque heures à faire les tests séparés avec l'ensemble de mes données.
Avec les compléments d'information apportés par tumasgiu, je pense que j'ai isolé d'où vient mon problème :
- le test sur les bassins versants méditerranéens marche à merveille avec la requête fournie (encore merci)
- par contre, sur le grand bassin versant du Rhône, la récursive bloque, et c'est là que je dois relancer plusieurs fois manuellement pour obtenir le résultat.

Donc vous aviez bien compris ma demande et :

pré-conditions de la requête:
Les tronçons sont tous connectés.
la valeur source d'un tronçon est égale à la valeur target des tronçons connectés en aval.


==> Oui, par bassin versant, sauf que certains target sont équivalents à plusieurs sources (bras de cours d'eau)

Pas de boucle dans le réseau.


==> Par contre là... voici une image de ce que je peux avoir sur le réseau correspondant au bassin du Rhône, ce qui pourrait correspondre aux boucles évoquées ? :
[img]http://imagizer.imageshack.us/v2/640x480q90/923/OFzlak.jpg[/img]

Et je confirme le reste des précisions de tumasgiu.


Peux-t-on gérer ces "boucles" de façon à obtenir le résultat en une seule fois ?
D'avance merci

Hors ligne

 

#12 Tue 10 October 2017 11:03

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

Re: Aide sur requête recursive

meonais a écrit:

- le test sur les bassins versants méditerranéens marche à merveille avec la requête fournie (encore merci)
- par contre, sur le grand bassin versant du Rhône, la récursive bloque, et c'est là que je dois relancer plusieurs fois manuellement pour obtenir le résultat.


Que voulez vous dire exactement ?
La requête est lancée sur l'ensemble des bassins versants, et les résultats ne sont corrects que sur une partie ?
La requête est lancée par bassins, et bloque  sur certains ?
Que veut dire bloquer ? La requête se termine ? avec un message d'erreur ?

meonais a écrit:

Pas de boucle dans le réseau.


==> Par contre là... voici une image de ce que je peux avoir sur le réseau correspondant au bassin du Rhône, ce qui pourrait correspondre aux boucles évoquées ? :


Je n'ai pas employé la terminologie exacte, je voulais parler de cycle
(on parle aussi de circuit dans le cas des graphes orientés) ,
Les cycles d'un graphe sont tout les chemins dont le sommet de départ est égale au sommet d'arrivée.
en tenant compte du sens des arcs si on se trouve dans un graphe orienté ce qui est votre cas.

Dernière modification par tumasgiu (Tue 10 October 2017 11:14)

Hors ligne

 

#13 Tue 10 October 2017 11:55

meonais
Participant occasionnel
Date d'inscription: 17 Jan 2017
Messages: 35

Re: Aide sur requête recursive

Bonjour tumasgiu,

tumasgiu a écrit:

Que voulez vous dire exactement ?
La requête est lancée sur l'ensemble des bassins versants, et les résultats ne sont corrects que sur une partie ?
La requête est lancée par bassins, et bloque  sur certains ?


Oups pardon, effectivement j'ai oublié une partie...

Alors j'ai procédé par étape pour tester :
- étape 1 : application du code sur l'extraction que je vous ai envoyé (qui ne contient que les entités des bassins côtiers) : ça fonctionne
- étape 2 : application du code sur la couche contenant l'ensemble de mes données. Deux tests avec sélection des secteurs, voir le code modifié ci-dessous

Code:

DROP FUNCTION IF EXISTS pg_temp.upd(t text) CASCADE;
CREATE FUNCTION pg_temp.upd(t text) RETURNS VOID
AS $$ BEGIN EXECUTE 'UPDATE test  t SET classe_corr = GREATEST(classe_corr, (SELECT max(classe_corr) FROM test   t2 WHERE t2.target = t.source)) WHERE t.idsplit IN (' || t || ' )'; END; $$
LANGUAGE plpgsql;


WITH 
RECURSIVE rec(depth, idsplit, s, e)
AS(
SELECT 0, t.idsplit, t.source , t.target, t.region_zone_hydro FROM test t
LEFT JOIN test  t2 
ON t.source = t2.target
WHERE t2.target IS NULL 
UNION 
SELECT depth + 1, t.idsplit, t.source, t.target, t.region_zone_hydro
FROM rec
 JOIN test  t
ON rec.e = t.source
WHERE t.region_zone_hydro NOT IN ('Côtiers Méditerranéens')
)
SELECT pg_temp.upd(string_agg(f.idsplit::text, ',')) 
FROM (SELECT max(depth) depth, idsplit FROM rec GROUP BY idsplit) f
WHERE depth > 0 
GROUP BY depth
ORDER BY depth;

Avec NOT IN ('Côtiers Méditerranéens') : le bassin du Rhône est correctement traité, en lançant la requête une seule fois - les bassins côtiers ne sont pas traités évidemment
Avec IN ('Côtiers Méditerranéens')  : les bassins côtiers sont correctement traités, en lançant la requête une seule fois  - le grand bassin du Rhône n'est pas traité évidemment

- étape 3 : application du code sur la couche contenant l'ensemble de mes entités (bassins côtiers et du Rhône), sans filtres sur les secteurs ==> pas de message d'erreur mais le résultat n'est que partiel, sur l'ensemble des entités de la couche (voir les illustrations du post du 2 octobre à 16h13). Il faut que je relance plusieurs fois la requête, dans la même configuration, pour avoir les résultats corrects sur l'ensemble des bassins versants (entités).

tumasgiu a écrit:

Je n'ai pas employé la terminologie exacte, je voulais parler de cycle
(on parle aussi de circuit dans le cas des graphes orientés) ,
Les cycles d'un graphe sont tout les chemins dont le sommet de départ est égale au sommet d'arrivée.
en tenant compte du sens des arcs si on se trouve dans un graphe orienté ce qui est votre cas.


Si j'ai bien compris, et si j'ai bien vérifié mes données roll, il n'y a normalement pas de cycle dedans...

Hors ligne

 

#14 Tue 24 October 2017 14:06

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

Re: Aide sur requête recursive

Si vous n'avez pas réussi à résoudre votre problème,

la seule chose qui me vient spontanément, est que vos
deux sous-ensembles (Bassin Rhône vs. Cotes Méditerranéennes)
doivent posséder des valeurs de champ identiques, ce qui empêcherait
la requête de s'exécuter correctement.

Est ce que les champs idsplit, source et target sont cohérents ?
çàd pas partagés entre vous deux sous-ensembles ?

Dernière modification par tumasgiu (Wed 25 October 2017 09:56)

Hors ligne

 

Pied de page des forums

Powered by FluxBB