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 :

[9.3] Nommer les récursions d'une requête récursive


Sujet :

Requêtes PostgreSQL

  1. #21
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Citation Envoyé par Gronimo Voir le message

    Donc, je n'ai, ici, qu'une seule récursivité. J'aimerais savoir comment avoir les autres.
    Pour tout avoir, il faut avoir autant de rnk_desc = 1 que de début (ou fin selon comment on approche le problème) de tronçon.

    Et pour répondre à cette question il va falloir que vous nous donnier plus de renseignement car perso je ne peut pas deviner ni vos données ni comment vous avez créé la vue nommée: init_recurs_ord_2

  2. #22
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2014
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Voici la façon dont j'ai créé init_recurs_ord_2 :

    Je suis tout d'abord parti d'une table "cours-eau-par-noeuds_hydro_2" de 279 lignes qui recense les tronçons hydrographiques principaux des bassins versants de ma zone (c à d qu'il y a 1 tronçn hydro par bassin versant). Je ne vous montre pas la table parce qu'elle est trop grande et que je vous expliquerai les tables que j'ai faites après.

    De cette table "cours-eau-par-noeuds_hydro_2", donc, j'ai sélectionné les colonnes les plus importantes, ainsi que certaines lignes qui représentent une même suite de tronçons hydrographiques. Voici la fonction, elle crée une table init_recurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE or replace VIEW init_recurs as
    SELECT conh.profondeur, conh.code_hydro, conh.c_hyd_cdo, conh.code_zone, conh.lettre_bv, conh.toponyme1, conh.fpkh, conh.tpkh,
    conh.id_nd_ini, conh.id_nd_fin, conh.geom
    from cours_eau_par_noeuds_hydro_2 as conh
    WHERE conh.toponyme1 = 'rivière le calavon' or conh.toponyme1 = 'rivière le coulon' or conh.code_zone = 'X350'
    or conh.code_zone = 'V700' or conh.code_zone = 'V720' or conh.code_zone = 'V721' or conh.code_zone = 'V730'
    ORDER BY lettre_bv desc, fpkh
    De cette fonction j'obtiens la table init_recurs suivante :

    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
     
    gid ; profondeur ; code_hydro ; c_hyd_cdo, code_zone, lettre_bv, toponyme1, fpkh, tpkh, id_nd_ini, id_nd_fin
     
    1;1;"X3400400";"X34-0400";"X340";"X";"rivière le calavon";913111;922089;614008612;614009387
    2;1;"X3410400";"X34-0400";"X341";"X";"rivière le calavon";922089;935022;614009387;615009013
    3;1;"X3420400";"X34-0400";"X342";"X";"rivière le calavon";935022;938396;615009013;615009662
    4;1;"X3430400";"X34-0400";"X343";"X";"rivière le calavon";938396;955523;615009662;615009286
    5;1;"X3450400";"X34-0400";"X345";"X";"rivière le calavon";955523;963787;615009286;619000560
    6;1;"X3460400";"X34-0400";"X346";"X";"rivière le coulon";963787;975108;619000560;619000784
    7;1;"X3480400";"X34-0400";"X348";"X";"rivière le coulon";975108;1000000;619000784;619000786
    8;1;"X3500000";"X---0000";"X350";"X";"rivière la durance";975886;1000000;619000786;614010566
    9;1;"V7000000";"V---0000";"V700";"V";"fleuve le rhône";916913;931497;614010566;619001184
    10;1;"V7200000";"V---0000";"V720";"V";"fleuve le rhône";931497;944880;619001184;619002712
    11;1;"V7210000";"V---0000";"V721";"V";"fleuve le rhône";944880;947663;619002712;619003051
    12;1;"V7300000";"V---0000";"V730";"V";"fleuve le rhône";947663;1000000;619003051;619005470
    De cette table, j'en ai créé une autre "init_recurs_ord_2" afin de rajouter la colonne rnk_desc qui est la colonne gid inversée. Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE or replace VIEW init_recurs_ord_2 as
    SELECT row_number() over(partition BY profondeur ORDER BY gid desc) as rnk_desc, * from init_recurs
    Voici le résultat en tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    1;12;1;"V7300000";"V---0000";"V730";"V";"fleuve le rhône";947663;1000000;619003051;619005470
    2;11;1;"V7210000";"V---0000";"V721";"V";"fleuve le rhône";944880;947663;619002712;619003051
    3;10;1;"V7200000";"V---0000";"V720";"V";"fleuve le rhône";931497;944880;619001184;619002712
    4;9;1;"V7000000";"V---0000";"V700";"V";"fleuve le rhône";916913;931497;614010566;619001184
    5;8;1;"X3500000";"X---0000";"X350";"X";"rivière la durance";975886;1000000;619000786;614010566
    6;7;1;"X3480400";"X34-0400";"X348";"X";"rivière le coulon";975108;1000000;619000784;619000786
    7;6;1;"X3460400";"X34-0400";"X346";"X";"rivière le coulon";963787;975108;619000560;619000784
    8;5;1;"X3450400";"X34-0400";"X345";"X";"rivière le calavon";955523;963787;615009286;619000560
    9;4;1;"X3430400";"X34-0400";"X343";"X";"rivière le calavon";938396;955523;615009662;615009286
    10;3;1;"X3420400";"X34-0400";"X342";"X";"rivière le calavon";935022;938396;615009013;615009662
    11;2;1;"X3410400";"X34-0400";"X341";"X";"rivière le calavon";922089;935022;614009387;615009013
    12;1;1;"X3400400";"X34-0400";"X340";"X";"rivière le calavon";913111;922089;614008612;614009387
    On remarque que, par le desc, le tableau s'est inversé. La 1ère colonne correspond à rnk_desc, la deuxième à gid.

    C'est donc comme ça que j'ai créé init_recurs_ord_2.
    Si vous voulez plus de précision, demandez-moi.

  3. #23
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2014
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Est-ce qu'il ne serait pas possible de faire comme pour une boucle en programmation.
    On initialise rnk_desc à 0 et on dit au logiciel, tant que rnk_desc<= max(rnk_desc), tu fais rnk_desc=rnk_desc + 1 et tu fais ta récursion.
    C'est vrai que si on pouvait utiliser les boucles sur les requêtes SQL, tout serait tellement plus facile...

  4. #24
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Citation Envoyé par Gronimo Voir le message
    De cette table "cours-eau-par-noeuds_hydro_2", donc, j'ai sélectionné les colonnes les plus importantes, ainsi que certaines lignes qui représentent une même suite de tronçons hydrographiques. Voici la fonction, elle crée une table init_recurs :
    .....
    Si vous voulez n'avoir qu'une suite de requête qui traite l'ensemble des données, il va falloir gérer la détermination de chaque tronçon dans la clause partition by.


    Je pensais que cette information était disponible grâce à la colonne "profondeur" mais apparemment ça n'est pas le cas.


    Actuellement c'est toutes ces conditions qui gère la notion de tronçon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    conh.toponyme1 = 'rivière le calavon' OR conh.toponyme1 = 'rivière le coulon' OR conh.code_zone = 'X350'
    OR conh.code_zone = 'V700' OR conh.code_zone = 'V720' OR conh.code_zone = 'V721' OR conh.code_zone = 'V730'
    C'est impossible, en l'état, d'en déduire un algorithme.

  5. #25
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2014
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Donc, qu'est-ce que vous me proposez ?

    Est-ce que je dois faire un partition by ? Comment dois-je le faire pour renseigner les zones précises où je veux travailler ?
    Après, le but de mon projet, c'est d'effectuer une requête récursive sur tous les tronçons de ma table initiale. Je n'avais sélectionner que certains cours d'eau et certains bassins versants uniquement pour simplifier les calculs dans un premier temps en prenant une même suite de tronçons, de la source à l'embouchure du Rhône. Si c'est plus simple de les effectuer sur toute ma table, je peux le faire.

    J'avais penser qu'on pouvait indiquer dans le "where rnk_desc = min (rnk_desc) over () as (...)", mais apparemment on ne peut pas mettre de telles fonctions dans un where. Serait-il possible de l'indiquer d'une autre manière dans un endroit du script où on aurait le droit de le faire ?

    Est-ce que ce que je veux faire est si impossible que ça ? Ça me semblerait étonnant...

  6. #26
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2014
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Désolé,
    Je n'avais pas écrit correctement la 1ère fonction et la table qui en découlait hier soir. Surement la fatigue...

    Donc, voilà la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    WITH recursive rec (gid, profondeur, code_zone_max, code_zone, lettre_bv, id_nd_ini, id_nd_fin, rnk_link) AS (
    SELECT gid, 1, code_zone, code_zone, lettre_bv, id_nd_ini, id_nd_fin, rnk_desc
    FROM init_recurs_ord_2
    union ALL
    SELECT b.gid, a.profondeur +1, code_zone_max, b.code_zone, b.lettre_bv, b.id_nd_ini, b.id_nd_fin, b.rnk_desc
    FROM rec a
    INNER JOIN init_recurs_ord_2 b ON b.id_nd_fin = a.id_nd_ini)
    SELECT * FROM rec
    Et voilà la table qui en découle :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    12;1;"V730";"V730";"V";619003051;619005470;1
    11;1;"V721";"V721";"V";619002712;619003051;2
    10;1;"V720";"V720";"V";619001184;619002712;3
    9;1;"V700";"V700";"V";614010566;619001184;4
    8;1;"X350";"X350";"X";619000786;614010566;5
    7;1;"X348";"X348";"X";619000784;619000786;6
    6;1;"X346";"X346";"X";619000560;619000784;7
    5;1;"X345";"X345";"X";615009286;619000560;8
    4;1;"X343";"X343";"X";615009662;615009286;9
    3;1;"X342";"X342";"X";615009013;615009662;10
    2;1;"X341";"X341";"X";614009387;615009013;11
    1;1;"X340";"X340";"X";614008612;614009387;12
    11;2;"V730";"V721";"V";619002712;619003051;2
    10;2;"V721";"V720";"V";619001184;619002712;3
    9;2;"V720";"V700";"V";614010566;619001184;4
    8;2;"V700";"X350";"X";619000786;614010566;5
    7;2;"X350";"X348";"X";619000784;619000786;6
    6;2;"X348";"X346";"X";619000560;619000784;7
    5;2;"X346";"X345";"X";615009286;619000560;8
    4;2;"X345";"X343";"X";615009662;615009286;9
    3;2;"X343";"X342";"X";615009013;615009662;10
    2;2;"X342";"X341";"X";614009387;615009013;11
    1;2;"X341";"X340";"X";614008612;614009387;12
    10;3;"V730";"V720";"V";619001184;619002712;3
    9;3;"V721";"V700";"V";614010566;619001184;4
    8;3;"V720";"X350";"X";619000786;614010566;5
    7;3;"V700";"X348";"X";619000784;619000786;6
     
    etc...
     
    3;10;"V730";"X342";"X";615009013;615009662;10
    2;10;"V721";"X341";"X";614009387;615009013;11
    1;10;"V720";"X340";"X";614008612;614009387;12
    2;11;"V730";"X341";"X";614009387;615009013;11
    1;11;"V721";"X340";"X";614008612;614009387;12
    1;12;"V730";"X340";"X";614008612;614009387;12
    On voit bien que ma deuxième colonne, la colonne profondeur a un numéro différent pour chaque récursivité. Je voudrais que, sur la troisième colonne (code_zone_max), apparaisse le nom du tronçon (code_zone) sur lequel s'effectue chaque récursivité.
    Ainsi, à côté du 1 de la colonne profondeur pour la 1ère récursivité, il s'afficherait V730 sur les 12 lignes.
    A côté du 2 de la colonne profondeur pour la 2e récursivité, il s'afficherait V720 sur 11 lignes.
    ...
    A côté du 10 de la colonne profondeur pour la 10e récursivité, il s'afficherait X342 sur 3 lignes.
    A côté du 11 de la colonne profondeur pour la 11e récursivité, il s'afficherait X341 sur 2 lignes.
    A côté du 12 de la colonne profondeur pour la 12e récursivité, il s'afficherait X340 sur 1 lignes.

  7. #27
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    cf ma 1ere réponse :

    Appliquez la fonction de fenetrage sur la partition profondeur et sur un tri descroissant sur la date.

    refaire une recursion en partant des tri égaux à 1 (donc la fin de l'arbre)... et remonter ...


    Sinon je trouve globalement qu'appliquer 2 récursions pour arriver à ce résultat un peu beaucoup.


    Mais n'ayant toujours pas compris comment arriver au résultat final avec vos données de bases (non présentée ni expliquée), je ne pourrai rien proposer d'autre.

  8. #28
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2014
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Je ne vous ai ni présenté ni expliqué mes données de base ???????? Mais je ne fait que ça depuis hier !!! (message d'hier à 17 h49)

    Bon, ben je vais recommencer depuis le début. D'ailleurs, je vous mets carrément les couches que j'ai utilisées en .zip. Vous trouverez les shapefile dedans et tout ce que vous voulez. Ces couches sont issues de la jointure des tables noeuds_hydrographiques, tronçons_hydrographiques et zones_hydrographiques (bassin versant) de la BD-Carthage. Le PDF vous explique chaque colonne de la table.

    Pour passer de la table cours_eau_par_noeuds_hydro à la table init_recurs_ord_2, je n'ai sélectionné que quelques tronçons hydrographiques qui représentent une même continuité de la source du cours d'eau jusqu'à l'embouchure du Rhône. Voilà la fonction qui m'a permis de passer de l'une à l'autre :

    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
     
    DROP VIEW init_recurs CASCADE
    CREATE or replace VIEW init_recurs as
    SELECT conh.profondeur, conh.code_hydro, conh.c_hyd_cdo, conh.code_zone, conh.lettre_bv, conh.toponyme1, conh.fpkh, conh.tpkh,
    conh.id_nd_ini, conh.id_nd_fin, conh.geom
    from cours_eau_par_noeuds_hydro_2 as conh
    WHERE conh.toponyme1 = 'rivière le calavon' or conh.toponyme1 = 'rivière le coulon' or conh.code_zone = 'X350'
    or conh.code_zone = 'V700' or conh.code_zone = 'V720' or conh.code_zone = 'V721' or conh.code_zone = 'V730'
    ORDER BY lettre_bv desc, fpkh
     
    DROP VIEW init_recurs_ord CASCADE
    CREATE or replace VIEW init_recurs_ord as
    SELECT row_number()OVER()::integer AS gid, * from init_recurs
     
    DROP VIEW init_recurs_ord_2 CASCADE
    CREATE or replace VIEW init_recurs_ord_2 as
    SELECT row_number() over(partition BY profondeur ORDER BY gid desc) as rnk_desc, * from init_recurs_ord
    Donc, comme je l'ai expliqué dans un de mes précédents messages. J'arrive à deux fonctions.
    La première est la suivante :

    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
    18
    19
    20
    21
    22
    23
    24
     
    DROP VIEW init_recurs_join CASCADE
    CREATE or replace VIEW init_recurs_join as
    WITH recursive tmp (gid, profondeur, code_zone, lettre_bv, id_nd_ini, id_nd_fin, chemin, boucle) AS (
    SELECT gid, 1, code_zone, lettre_bv, id_nd_ini, id_nd_fin, ARRAY [gid], false
    FROM init_recurs_ord
    union ALL
    SELECT b.gid, a.profondeur +1, b.code_zone, b.lettre_bv, b.id_nd_ini, b.id_nd_fin, chemin || b.gid, b.gid=ANY(chemin)
    FROM init_recurs_ord b
    INNER JOIN tmp a ON b.id_nd_fin = a.id_nd_ini )
    SELECT gid, profondeur, code_zone, lettre_bv, id_nd_ini, id_nd_fin,
    row_number() over(partition BY profondeur ORDER BY gid desc) AS rnk_desc, chemin, boucle
    FROM tmp
     
     
    WITH recursive rec (gid, profondeur, code_zone_max, code_zone, lettre_bv, id_nd_ini, id_nd_fin, rnk_link, chemin) AS (
    SELECT gid, 1, code_zone, code_zone, lettre_bv, id_nd_ini, id_nd_fin, rnk_desc, '' || code_zone AS chemin
    FROM init_recurs_join
    WHERE rnk_desc = 1
    union ALL
    SELECT b.gid, a.profondeur+1, a.code_zone_max, b.code_zone, b.lettre_bv, b.id_nd_ini, b.id_nd_fin, b.rnk_desc, a.chemin || ' > ' || b.code_zone
    FROM rec a
    INNER JOIN init_recurs_join b ON b.id_nd_fin = a.id_nd_ini AND a.rnk_link + 1 = b.rnk_desc)
    SELECT * FROM rec
    Et me donne ceci :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    12;1;"V730";"V730";"V";619003051;619005470;1;"V730"
    11;1;"V721";"V721";"V";619002712;619003051;1;"V721"
    10;1;"V720";"V720";"V";619001184;619002712;1;"V720"
    9;1;"V700";"V700";"V";614010566;619001184;1;"V700"
    8;1;"X350";"X350";"X";619000786;614010566;1;"X350"
    7;1;"X348";"X348";"X";619000784;619000786;1;"X348"
    6;1;"X346";"X346";"X";619000560;619000784;1;"X346"
    5;1;"X345";"X345";"X";615009286;619000560;1;"X345"
    4;1;"X343";"X343";"X";615009662;615009286;1;"X343"
    3;1;"X342";"X342";"X";615009013;615009662;1;"X342"
    2;1;"X341";"X341";"X";614009387;615009013;1;"X341"
    1;1;"X340";"X340";"X";614008612;614009387;1;"X340"
    11;2;"V730";"V721";"V";619002712;619003051;2;"V730 > V721"
    10;2;"V721";"V720";"V";619001184;619002712;2;"V721 > V720"
    9;2;"V720";"V700";"V";614010566;619001184;2;"V720 > V700"
    8;2;"V700";"X350";"X";619000786;614010566;2;"V700 > X350"
    7;2;"X350";"X348";"X";619000784;619000786;2;"X350 > X348"
    6;2;"X348";"X346";"X";619000560;619000784;2;"X348 > X346"
    5;2;"X346";"X345";"X";615009286;619000560;2;"X346 > X345"
    4;2;"X345";"X343";"X";615009662;615009286;2;"X345 > X343"
    3;2;"X343";"X342";"X";615009013;615009662;2;"X343 > X342"
    2;2;"X342";"X341";"X";614009387;615009013;2;"X342 > X341"
    1;2;"X341";"X340";"X";614008612;614009387;2;"X341 > X340"
    10;3;"V730";"V720";"V";619001184;619002712;3;"V730 > V721 > V720"
    9;3;"V721";"V700";"V";614010566;619001184;3;"V721 > V720 > V700"
    8;3;"V720";"X350";"X";619000786;614010566;3;"V720 > V700 > X350"
    7;3;"V700";"X348";"X";619000784;619000786;3;"V700 > X350 > X348"
    6;3;"X350";"X346";"X";619000560;619000784;3;"X350 > X348 > X346"
    5;3;"X348";"X345";"X";615009286;619000560;3;"X348 > X346 > X345"
    4;3;"X346";"X343";"X";615009662;615009286;3;"X346 > X345 > X343"
    3;3;"X345";"X342";"X";615009013;615009662;3;"X345 > X343 > X342"
    2;3;"X343";"X341";"X";614009387;615009013;3;"X343 > X342 > X341"
    1;3;"X342";"X340";"X";614008612;614009387;3;"X342 > X341 > X340"
    9;4;"V730";"V700";"V";614010566;619001184;4;"V730 > V721 > V720 > V700"
    8;4;"V721";"X350";"X";619000786;614010566;4;"V721 > V720 > V700 > X350"
    7;4;"V720";"X348";"X";619000784;619000786;4;"V720 > V700 > X350 > X348"
    6;4;"V700";"X346";"X";619000560;619000784;4;"V700 > X350 > X348 > X346"
    5;4;"X350";"X345";"X";615009286;619000560;4;"X350 > X348 > X346 > X345"
    4;4;"X348";"X343";"X";615009662;615009286;4;"X348 > X346 > X345 > X343"
    3;4;"X346";"X342";"X";615009013;615009662;4;"X346 > X345 > X343 > X342"
    2;4;"X345";"X341";"X";614009387;615009013;4;"X345 > X343 > X342 > X341"
    1;4;"X343";"X340";"X";614008612;614009387;4;"X343 > X342 > X341 > X340"
    8;5;"V730";"X350";"X";619000786;614010566;5;"V730 > V721 > V720 > V700 > X350"
    7;5;"V721";"X348";"X";619000784;619000786;5;"V721 > V720 > V700 > X350 > X348"
    6;5;"V720";"X346";"X";619000560;619000784;5;"V720 > V700 > X350 > X348 > X346"
    5;5;"V700";"X345";"X";615009286;619000560;5;"V700 > X350 > X348 > X346 > X345"
    4;5;"X350";"X343";"X";615009662;615009286;5;"X350 > X348 > X346 > X345 > X343"
    3;5;"X348";"X342";"X";615009013;615009662;5;"X348 > X346 > X345 > X343 > X342"
    2;5;"X346";"X341";"X";614009387;615009013;5;"X346 > X345 > X343 > X342 > X341"
    1;5;"X345";"X340";"X";614008612;614009387;5;"X345 > X343 > X342 > X341 > X340"
    7;6;"V730";"X348";"X";619000784;619000786;6;"V730 > V721 > V720 > V700 > X350 > X348"
    6;6;"V721";"X346";"X";619000560;619000784;6;"V721 > V720 > V700 > X350 > X348 > X346"
    5;6;"V720";"X345";"X";615009286;619000560;6;"V720 > V700 > X350 > X348 > X346 > X345"
    4;6;"V700";"X343";"X";615009662;615009286;6;"V700 > X350 > X348 > X346 > X345 > X343"
    3;6;"X350";"X342";"X";615009013;615009662;6;"X350 > X348 > X346 > X345 > X343 > X342"
    2;6;"X348";"X341";"X";614009387;615009013;6;"X348 > X346 > X345 > X343 > X342 > X341"
    1;6;"X346";"X340";"X";614008612;614009387;6;"X346 > X345 > X343 > X342 > X341 > X340"
    6;7;"V730";"X346";"X";619000560;619000784;7;"V730 > V721 > V720 > V700 > X350 > X348 > X346"
    5;7;"V721";"X345";"X";615009286;619000560;7;"V721 > V720 > V700 > X350 > X348 > X346 > X345"
    4;7;"V720";"X343";"X";615009662;615009286;7;"V720 > V700 > X350 > X348 > X346 > X345 > X343"
    3;7;"V700";"X342";"X";615009013;615009662;7;"V700 > X350 > X348 > X346 > X345 > X343 > X342"
    2;7;"X350";"X341";"X";614009387;615009013;7;"X350 > X348 > X346 > X345 > X343 > X342 > X341"
    1;7;"X348";"X340";"X";614008612;614009387;7;"X348 > X346 > X345 > X343 > X342 > X341 > X340"
    5;8;"V730";"X345";"X";615009286;619000560;8;"V730 > V721 > V720 > V700 > X350 > X348 > X346 > X345"
    4;8;"V721";"X343";"X";615009662;615009286;8;"V721 > V720 > V700 > X350 > X348 > X346 > X345 > X343"
    3;8;"V720";"X342";"X";615009013;615009662;8;"V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342"
    2;8;"V700";"X341";"X";614009387;615009013;8;"V700 > X350 > X348 > X346 > X345 > X343 > X342 > X341"
    1;8;"X350";"X340";"X";614008612;614009387;8;"X350 > X348 > X346 > X345 > X343 > X342 > X341 > X340"
    4;9;"V730";"X343";"X";615009662;615009286;9;"V730 > V721 > V720 > V700 > X350 > X348 > X346 > X345 > X343"
    3;9;"V721";"X342";"X";615009013;615009662;9;"V721 > V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342"
    2;9;"V720";"X341";"X";614009387;615009013;9;"V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342 > X341"
    1;9;"V700";"X340";"X";614008612;614009387;9;"V700 > X350 > X348 > X346 > X345 > X343 > X342 > X341 > X340"
    3;10;"V730";"X342";"X";615009013;615009662;10;"V730 > V721 > V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342"
    2;10;"V721";"X341";"X";614009387;615009013;10;"V721 > V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342 > X341"
    1;10;"V720";"X340";"X";614008612;614009387;10;"V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342 > X341 > X340"
    2;11;"V730";"X341";"X";614009387;615009013;11;"V730 > V721 > V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342 > X341"
    1;11;"V721";"X340";"X";614008612;614009387;11;"V721 > V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342 > X341 > X340"
    1;12;"V730";"X340";"X";614008612;614009387;12;"V730 > V721 > V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342 > X341 > X340"
    La deuxième fonction est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH recursive rec (gid, profondeur, code_zone_max, code_zone, lettre_bv, id_nd_ini, id_nd_fin, rnk_link) AS (
    SELECT gid, 1, code_zone, code_zone, lettre_bv, id_nd_ini, id_nd_fin, rnk_desc
    FROM init_recurs_ord_2
    WHERE rnk_desc = 1
    union ALL
    SELECT b.gid, a.profondeur +1, b.code_zone, b.code_zone, b.lettre_bv, b.id_nd_ini, b.id_nd_fin, b.rnk_desc
    FROM rec a
    INNER JOIN init_recurs_ord_2 b ON b.id_nd_fin = a.id_nd_ini AND a.rnk_link + 1 = b.rnk_desc)
    SELECT * FROM rec
    Et me donne ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    12;1;"V730";"V730";"V";619003051;619005470;1
    11;2;"V721";"V721";"V";619002712;619003051;2
    10;3;"V720";"V720";"V";619001184;619002712;3
    9;4;"V700";"V700";"V";614010566;619001184;4
    8;5;"X350";"X350";"X";619000786;614010566;5
    7;6;"X348";"X348";"X";619000784;619000786;6
    6;7;"X346";"X346";"X";619000560;619000784;7
    5;8;"X345";"X345";"X";615009286;619000560;8
    4;9;"X343";"X343";"X";615009662;615009286;9
    3;10;"X342";"X342";"X";615009013;615009662;10
    2;11;"X341";"X341";"X";614009387;615009013;11
    1;12;"X340";"X340";"X";614008612;614009387;12
    Moi je voudrais un mix des deux fonctions qui me donnerait la table suivante (faite à la main) :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    12;1;"V730";"V730";"V";619003051;619005470;1
    11;1;" V730";"V721";"V";619002712;619003051;2
    10;1;" V730";"V720";"V";619001184;619002712;3
    9;1;" V730";"V700";"V";614010566;619001184;4
    8;1;" V730";"X350";"X";619000786;614010566;5
    7;1;" V730";"X348";"X";619000784;619000786;6
    6;1;" V730";"X346";"X";619000560;619000784;7
    5;1;" V730";"X345";"X";615009286;619000560;8
    4;1;" V730";"X343";"X";615009662;615009286;9
    3;1;" V730";"X342";"X";615009013;615009662;10
    2;1;" V730";"X341";"X";614009387;615009013;11
    1;1;" V730";"X340";"X";614008612;614009387;12
    11;2;"V721";"V721";"V";619002712;619003051;2
    10;2;" V721";"V720";"V";619001184;619002712;3
    9;2;" V721";"V700";"V";614010566;619001184;4
    8;2;" V721";"X350";"X";619000786;614010566;5
    7;2;" V721";"X348";"X";619000784;619000786;6
    6;2;" V721";"X346";"X";619000560;619000784;7
    5;2;" V721";"X345";"X";615009286;619000560;8
    4;2;" V721";"X343";"X";615009662;615009286;9
    3;2;" V721";"X342";"X";615009013;615009662;10
    2;2;" V721";"X341";"X";614009387;615009013;11
    1;2;" V721";"X340";"X";614008612;614009387;12
    10;3;"V720";"V720";"V";619001184;619002712;3
    9;3;" V720";"V700";"V";614010566;619001184;4
    8;3;" V720";"X350";"X";619000786;614010566;5
    7;3;" V720";"X348";"X";619000784;619000786;6
    6;3;" V720";"X346";"X";619000560;619000784;7
    5;3;" V720";"X345";"X";615009286;619000560;8
    4;3;" V720";"X343";"X";615009662;615009286;9
    3;3;" V720";"X342";"X";615009013;615009662;10
    2;3;" V720";"X341";"X";614009387;615009013;11
    1;3;" V720";"X340";"X";614008612;614009387;12
    9;4;"V700";"V700";"V";614010566;619001184;4
    8;4;" V700";"X350";"X";619000786;614010566;5
    7;4;" V700";"X348";"X";619000784;619000786;6
    6;4;" V700";"X346";"X";619000560;619000784;7
    5;4;" V700";"X345";"X";615009286;619000560;8
    4;4;" V700";"X343";"X";615009662;615009286;9
    3;4;" V700";"X342";"X";615009013;615009662;10
    2;4;" V700";"X341";"X";614009387;615009013;11
    1;4;" V700";"X340";"X";614008612;614009387;12
    8;5;"X350";"X350";"X";619000786;614010566;5
    7;5;" X350";"X348";"X";619000784;619000786;6
    6;5;" X350";"X346";"X";619000560;619000784;7
    5;5;" X350";"X345";"X";615009286;619000560;8
    4;5;" X350";"X343";"X";615009662;615009286;9
    3;5;" X350";"X342";"X";615009013;615009662;10
    2;5;" X350";"X341";"X";614009387;615009013;11
    1;5;" X350";"X340";"X";614008612;614009387;12
    7;6;"X348";"X348";"X";619000784;619000786;6
    6;6;" X348";"X346";"X";619000560;619000784;7
    5;6;" X348";"X345";"X";615009286;619000560;8
    4;6;" X348";"X343";"X";615009662;615009286;9
    3;6;" X348";"X342";"X";615009013;615009662;10
    2;6;" X348";"X341";"X";614009387;615009013;11
    1;6;" X348";"X340";"X";614008612;614009387;12
    6;7;"X346";"X346";"X";619000560;619000784;7
    5;7;" X346";"X345";"X";615009286;619000560;8
    4;7;" X346";"X343";"X";615009662;615009286;9
    3;7;" X346";"X342";"X";615009013;615009662;10
    2;7;" X346";"X341";"X";614009387;615009013;11
    1;7;" X346";"X340";"X";614008612;614009387;12
    5;8;"X345";"X345";"X";615009286;619000560;8
    4;8;" X345";"X343";"X";615009662;615009286;9
    3;8;" X345";"X342";"X";615009013;615009662;10
    2;8;" X345";"X341";"X";614009387;615009013;11
    1;8;" X345";"X340";"X";614008612;614009387;12
    4;9;"X343";"X343";"X";615009662;615009286;9
    3;9;" X343";"X342";"X";615009013;615009662;10
    2;9;" X343";"X341";"X";614009387;615009013;11
    1;9;" X343";"X340";"X";614008612;614009387;12
    3;10;"X342";"X342";"X";615009013;615009662;10
    2;10;" X342";"X341";"X";614009387;615009013;11
    1;10;" X342";"X340";"X";614008612;614009387;12
    2;11;"X341";"X341";"X";614009387;615009013;11
    1;11;" X341";"X340";"X";614008612;614009387;12
    1;12;"X340";"X340";"X";614008612;614009387;12
    Où l'on voit bien que à chaque ligne d'une récursivité, le nom du code_zone où la récursivité a été faite est indiquée à chaque ligne dans la colonne code_zone_max. Et c'est ça que je cherche à faire de façon automatique.

    J'espère que j'ai été assez exhaustif.

    Merci, en tout cas, de prendre mon cas à cœur.
    Images attachées Images attachées
    Fichiers attachés Fichiers attachés

  9. #29
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Je ne vous ai ni présenté ni expliqué mes données de base ???????? Mais je ne fait que ça depuis hier !!! (message d'hier à 17 h49)
    Les données de base n'ont jamais été présentées.

    Les seuls données fournies et expliquées sont celle issue de votre 1ere fonction qui sélectionne un certain nombre de tronçon (init_recurs).


    Si on reprend la vue init_rec de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    create view init_rec as
    with recursive rec (gid, profondeur, code_zone_max, code_zone, id_nd_ini, id_nd_fin, chemin) as (
    select gid, 1, code_zone, code_zone, id_nd_ini, id_nd_fin, code_zone::text
    from FLOW
    union all
    select a.gid, a.profondeur + 1, a.code_zone_max, b.code_zone, b.id_nd_ini, b.id_nd_fin, a.chemin || ' > ' || b.code_zone
    from rec a
    inner join flow b on a.id_nd_ini = b.id_nd_fin)
    select *
    from rec;

    Et que l'on execute cette requete toute simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from init_rec order by 1, profondeur desc
    Est-ce ok ?

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
     
    1;1;X340;X340;614008612;614009387;X340
    2;2;X341;X340;614008612;614009387;X341 > X340
    2;1;X341;X341;614009387;615009013;X341
    3;3;X342;X340;614008612;614009387;X342 > X341 > X340
    3;2;X342;X341;614009387;615009013;X342 > X341
    3;1;X342;X342;615009013;615009662;X342
    4;4;X343;X340;614008612;614009387;X343 > X342 > X341 > X340
    4;3;X343;X341;614009387;615009013;X343 > X342 > X341
    4;2;X343;X342;615009013;615009662;X343 > X342
    4;1;X343;X343;615009662;615009286;X343
    5;5;X345;X340;614008612;614009387;X345 > X343 > X342 > X341 > X340
    5;4;X345;X341;614009387;615009013;X345 > X343 > X342 > X341
    5;3;X345;X342;615009013;615009662;X345 > X343 > X342
    5;2;X345;X343;615009662;615009286;X345 > X343
    5;1;X345;X345;615009286;619000560;X345
    6;6;X346;X340;614008612;614009387;X346 > X345 > X343 > X342 > X341 > X340
    6;5;X346;X341;614009387;615009013;X346 > X345 > X343 > X342 > X341
    6;4;X346;X342;615009013;615009662;X346 > X345 > X343 > X342
    6;3;X346;X343;615009662;615009286;X346 > X345 > X343
    6;2;X346;X345;615009286;619000560;X346 > X345
    6;1;X346;X346;619000560;619000784;X346
    7;7;X348;X340;614008612;614009387;X348 > X346 > X345 > X343 > X342 > X341 > X340
    7;6;X348;X341;614009387;615009013;X348 > X346 > X345 > X343 > X342 > X341
    7;5;X348;X342;615009013;615009662;X348 > X346 > X345 > X343 > X342
    7;4;X348;X343;615009662;615009286;X348 > X346 > X345 > X343
    7;3;X348;X345;615009286;619000560;X348 > X346 > X345
    7;2;X348;X346;619000560;619000784;X348 > X346
    7;1;X348;X348;619000784;619000786;X348
    8;8;X350;X340;614008612;614009387;X350 > X348 > X346 > X345 > X343 > X342 > X341 > X340
    8;7;X350;X341;614009387;615009013;X350 > X348 > X346 > X345 > X343 > X342 > X341
    8;6;X350;X342;615009013;615009662;X350 > X348 > X346 > X345 > X343 > X342
    8;5;X350;X343;615009662;615009286;X350 > X348 > X346 > X345 > X343
    8;4;X350;X345;615009286;619000560;X350 > X348 > X346 > X345
    8;3;X350;X346;619000560;619000784;X350 > X348 > X346
    8;2;X350;X348;619000784;619000786;X350 > X348
    8;1;X350;X350;619000786;614010566;X350
    9;9;V700;X340;614008612;614009387;V700 > X350 > X348 > X346 > X345 > X343 > X342 > X341 > X340
    9;8;V700;X341;614009387;615009013;V700 > X350 > X348 > X346 > X345 > X343 > X342 > X341
    9;7;V700;X342;615009013;615009662;V700 > X350 > X348 > X346 > X345 > X343 > X342
    9;6;V700;X343;615009662;615009286;V700 > X350 > X348 > X346 > X345 > X343
    9;5;V700;X345;615009286;619000560;V700 > X350 > X348 > X346 > X345
    9;4;V700;X346;619000560;619000784;V700 > X350 > X348 > X346
    9;3;V700;X348;619000784;619000786;V700 > X350 > X348
    9;2;V700;X350;619000786;614010566;V700 > X350
    9;1;V700;V700;614010566;619001184;V700
    10;10;V720;X340;614008612;614009387;V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342 > X341 > X340
    10;9;V720;X341;614009387;615009013;V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342 > X341
    10;8;V720;X342;615009013;615009662;V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342
    10;7;V720;X343;615009662;615009286;V720 > V700 > X350 > X348 > X346 > X345 > X343
    10;6;V720;X345;615009286;619000560;V720 > V700 > X350 > X348 > X346 > X345
    10;5;V720;X346;619000560;619000784;V720 > V700 > X350 > X348 > X346
    10;4;V720;X348;619000784;619000786;V720 > V700 > X350 > X348
    10;3;V720;X350;619000786;614010566;V720 > V700 > X350
    10;2;V720;V700;614010566;619001184;V720 > V700
    10;1;V720;V720;619001184;619002712;V720
    11;11;V721;X340;614008612;614009387;V721 > V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342 > X341 > X340
    11;10;V721;X341;614009387;615009013;V721 > V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342 > X341
    11;9;V721;X342;615009013;615009662;V721 > V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342
    11;8;V721;X343;615009662;615009286;V721 > V720 > V700 > X350 > X348 > X346 > X345 > X343
    11;7;V721;X345;615009286;619000560;V721 > V720 > V700 > X350 > X348 > X346 > X345
    11;6;V721;X346;619000560;619000784;V721 > V720 > V700 > X350 > X348 > X346
    11;5;V721;X348;619000784;619000786;V721 > V720 > V700 > X350 > X348
    11;4;V721;X350;619000786;614010566;V721 > V720 > V700 > X350
    11;3;V721;V700;614010566;619001184;V721 > V720 > V700
    11;2;V721;V720;619001184;619002712;V721 > V720
    11;1;V721;V721;619002712;619003051;V721
    12;12;V730;X340;614008612;614009387;V730 > V721 > V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342 > X341 > X340
    12;11;V730;X341;614009387;615009013;V730 > V721 > V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342 > X341
    12;10;V730;X342;615009013;615009662;V730 > V721 > V720 > V700 > X350 > X348 > X346 > X345 > X343 > X342
    12;9;V730;X343;615009662;615009286;V730 > V721 > V720 > V700 > X350 > X348 > X346 > X345 > X343
    12;8;V730;X345;615009286;619000560;V730 > V721 > V720 > V700 > X350 > X348 > X346 > X345
    12;7;V730;X346;619000560;619000784;V730 > V721 > V720 > V700 > X350 > X348 > X346
    12;6;V730;X348;619000784;619000786;V730 > V721 > V720 > V700 > X350 > X348
    12;5;V730;X350;619000786;614010566;V730 > V721 > V720 > V700 > X350
    12;4;V730;V700;614010566;619001184;V730 > V721 > V720 > V700
    12;3;V730;V720;619001184;619002712;V730 > V721 > V720
    12;2;V730;V721;619002712;619003051;V730 > V721
    12;1;V730;V730;619003051;619005470;V730
    (le jeu de test repris est celui donnée dans le message d'hier de 15h23)

    Si ça ne l'ai pas, j'avoue ne pas comprendre le résultat souhaité par rapport aux 12 lignes d'entrées

  10. #30
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2014
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Et bien ça marche Punkoff !!!

    Merci merci et merci !

    J'ai les récursivités comme je veux. C'est une façon ultra détournée, mais ça marche...

    Néanmoins, je ne vais pas marquer ce sujet comme résolu tout de suite. J'ai la mauvaise nouvelle de vous annoncer que, lorsque j'effectuais les tests pour résoudre le problème de nomination, j'ai trouvé le problème que je vais avoir pour la prochaine étape ! Celle où je vais revenir à ma base de données première que j'ai mise en pièce jointe comme "cours_eau_par_nœuds_hydro". Parce que j'ai remarqué que lorsque je faisais une récursion sur cette table et bien ... Bon, je garde le suspens pour plus tard. Après tout, peut-être que votre fonction miraculeuse me permettra de résoudre ce problème. Mais, ça m'étonnerait, puisque, pour dévoiler en spin off le début de mon prochain problème, j'ai l'impression que ça merde sur les branchements des cours d'eau entre eux, c'est à dire au niveau des confluences. Mais bon, je n'en dis pas plu.

    En tout cas, merci et remerci à vous, Punkoff. Je ne sais pas ce que j'aurais fait sans vous. Vous êtes le seul à me répondre.

    A tout de suite...

  11. #31
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Après tout, peut-être que votre fonction miraculeuse me permettra de résoudre ce problème.

    Il y a peu de chance.

    Il faudrait présenter le problème d'une façon globale pour pouvoir répondre au sujet globalement via sql.

    Là on ne peut répondre que sur la base de la sortie de la vue init_recurs, ce qui change grandement la manière d'aborder le problème.


    Quand à la base jointe, perso je n'ai pas arcView, seulement postgresql.

  12. #32
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2014
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Et bien, votre fonction est miraculeuse !!!

    Elle m'a résolu le problème que j'avais eu lorsque je faisais les tests pour le problème précédent.

    Je vais pouvoir marquer ce sujet comme résolu !

    Il fallait de l'idée pour marquer ce order by 1, profondeur DESC.
    D'ailleurs je crains ne pas saisir totalement cet order by, notamment au niveau du 1.

    En tout cas, je vous remercie énormément. Grâce à vous mon projet a fait un pas de géant !

    Je vais pouvoir continuer ! Je pense que je n'aurai plus de problème à partir de maintenant, mais on ne sait jamais...

    En tout cas, merci beaucoup pour tout le temps que vous m'avez consacré. Sur les 3 forums où je suis allé, vous êtes le seul à m'avoir répondu. Je saurais où aller, à l'avenir, lorsque j'aurai des problèmes sur postgresql.

    Bonne journée.

    PS : Pas besoin d'ArcView pour ouvrir mes couches. QGIS suffit et c'est gratuit. C'est des shapefiles mes trucs.
    D'ailleurs, je les enlève tout de suite du forum.

  13. #33
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    En fait, dans la fonction recursive, j'ai gardé le gid de la 1ere itération en faisant un a.gid sur la 2eme requete.

    Je ne voyais pas d'autre moyen de garder la trace des choses ... (on aurait put émuler ceci avec un row_number over() cecci étant dit dans la 1ere requete).


    Ensuite ORDER by 1 c'est un raccourci pour dire d'ordonner selon la 1ere colonne résultante.

  14. #34
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2014
    Messages : 28
    Points : 11
    Points
    11
    Par défaut
    Et bien merci, alors. C'était la bonne solution.

  15. #35
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    Citation Envoyé par Gronimo Voir le message
    Est-ce qu'il ne serait pas possible de faire comme pour une boucle en programmation.
    On initialise rnk_desc à 0 et on dit au logiciel, tant que rnk_desc<= max(rnk_desc), tu fais rnk_desc=rnk_desc + 1 et tu fais ta récursion.
    C'est vrai que si on pouvait utiliser les boucles sur les requêtes SQL, tout serait tellement plus facile...
    Dans ce cas il faut programmer en plpgsql. Ca autorise le découpage du problème en plusieurs requêtes et d'articuler le tout dans une logique procédurale, avec boucles, structures de contrôle, variables, tables temporaires, etc...

    A partir d'un certain niveau de complexité, tout caculer en une seule requête est contre-productif en temps de mise au point.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Comment nommer les versions d'une application
    Par Bweb dans le forum Langages de programmation
    Réponses: 10
    Dernier message: 15/02/2013, 15h07
  2. Limiter les résultats d'une requête à \today\' - n jours
    Par Eddy Duflos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 19/10/2005, 08h46
  3. Réponses: 2
    Dernier message: 05/10/2005, 15h27
  4. [JDBC] Stocker les résultats d'une requête
    Par etiennegaloup dans le forum JDBC
    Réponses: 9
    Dernier message: 26/07/2005, 18h18
  5. norme pour nommer les objets d'une bd
    Par katou3 dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 13/07/2005, 12h30

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