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. #1
    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 [9.3] Nommer les récursions d'une requête récursive
    Bonjour à tous,

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH RECURSIVE en_aval(profondeur, code_zone, id_nd_ini, id_nd_fin, geom) AS (
     SELECT 1, code_zone, id_nd_ini, id_nd_fin, geom
      FROM essai_pl
    UNION ALL
      SELECT ea.profondeur + 1, e.code_zone, e.id_nd_ini, e.id_nd_fin, e.geom
      FROM en_aval  AS ea, essai_pl AS e 
      WHERE e.id_nd_fin = ea.id_nd_ini
    )
    SELECT row_number()OVER()::integer AS gid, * FROM en_aval
    Dans la colonne "profondeur" de cette requête, il m'est indiqué un numéro pour chaque récursion (1 pour la première, 2 pour la seconde, 3 pour la troisième,...). J'aimerais remplacer ce numéro par l'identifiant de la zone où est pratiquée chaque récursion (code_zone). Il s'agit d'une chaîne de caractères sous la forme : lettre numéro numéro numéro.

    Je vous remercie pour vos futures réponses.

    Géronimo

  2. #2
    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
    Bonjour,

    Dans vos essais, qu'est-ce qui ne fonctionne pas ?

    Car là, c'est plus que bateau pour trouver la solution

  3. #3
    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
    Merci de me répondre, Punkoff.

    Rien ne marche pas.

    Je veux juste transformer ma colonne profondeur pour changer les numéros :

    Ici, la profondeur est la deuxième colonne et le code_zone, la troisième :

    1;1;"X340"
    2;1;"X341"
    3;1;"X342"
    4;1;"X343"
    5;1;"X345"
    6;1;"X346"
    7;1;"X348"
    8;2;"X340"
    9;2;"X341"
    10;2;"X343"
    11;2;"X342"
    12;2;"X345"
    13;2;"X346"
    14;3;"X340"
    15;3;"X341"
    16;3;"X343"
    17;3;"X342"
    18;3;"X345"
    19;4;"X340"
    20;4;"X341"
    21;4;"X343"
    22;4;"X342"
    23;5;"X340"
    24;5;"X341"
    25;5;"X342"
    26;6;"X340"
    27;6;"X341"
    28;7;"X340"

    Moi je voudrais qu'il me donne :

    1;"X348";"X340"
    2;"X348";"X341"
    3;"X348";"X342"
    4;"X348";"X343"
    5;"X348";"X345"
    6;"X348";"X346"
    7;"X348";"X348"
    8;"X346";"X340"
    9;"X346";"X341"
    10;"X346";"X343"
    11;"X346";"X342"
    12;"X346";"X345"
    13;"X346";"X346"
    14;"X345";"X340"
    15;"X345";"X341"
    16;"X345";"X343"
    17;"X345";"X342"
    18;"X345";"X345"
    19;"X342";"X340"
    20;"X342";"X341"
    21;"X342";"X343"
    22;"X342";"X342"
    23;"X342";"X340"
    24;"X342";"X341"
    25;"X342";"X342"
    26;"X341";"X340"
    27;"X341";"X341"
    28;"X340";"X340"


    Vous pouvez remarquer que pour passer au deuxième tableau, j'ai fait correspondre chaque numéro de récursion de la table profondeur au numéro de zone où a été effectuée la récursion, c'est-à-dire, la dernière zone de chaque liste de récursion. Mais je viens de le faire à la main et je voudrais connaître de quelle façon je peux le faire de façon automatisée.

    Je vous remercie de votre future réponse.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Je suppose que dans la table essai_pl, la colonne id_nd_fin est à NULL pour le dernier élément.

    Dans votre requête finale, vous pouvez donc faire une jointure sur la table essai_pl, avec comme conditions : le même code zone ET id_nd_fin à NULL

  5. #5
    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 ma table entière. Les deux dernières colonnes correspondent à id_nd_ini et id_nd_fin. Comme vous pouvez le voir, aucune valeur n'est null.

    1;1;"X340";614008612;614009387
    2;1;"X341";614009387;615009013
    3;1;"X342";615009013;615009662
    4;1;"X343";615009662;615009286
    5;1;"X345";615009286;619000560
    6;1;"X346";619000560;619000784
    7;1;"X348";619000784;619000786
    8;2;"X340";614008612;614009387
    9;2;"X341";614009387;615009013
    10;2;"X343";615009662;615009286
    11;2;"X342";615009013;615009662
    12;2;"X345";615009286;619000560
    13;2;"X346";619000560;619000784
    14;3;"X340";614008612;614009387
    15;3;"X341";614009387;615009013
    16;3;"X343";615009662;615009286
    17;3;"X342";615009013;615009662
    18;3;"X345";615009286;619000560
    19;4;"X340";614008612;614009387
    20;4;"X341";614009387;615009013
    21;4;"X343";615009662;615009286
    22;4;"X342";615009013;615009662
    23;5;"X340";614008612;614009387
    24;5;"X341";614009387;615009013
    25;5;"X342";615009013;615009662
    26;6;"X340";614008612;614009387
    27;6;"X341";614009387;615009013
    28;7;"X340";614008612;614009387

    Je ne comprends pas la jointure que vous voulez que je fasse. Est-ce que vous pourriez écrire, s'il vous plait, le script comme il devrait l'être ? Ce serait gentil.

    En tout cas, merci de me répondre si rapidement.

  6. #6
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Quelque chose d'aussi compliqué que ça ?
    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
    WITH RECURSIVE en_aval
        (   profondeur
        ,   code_zone
        ,   id_nd_ini
        ,   id_nd_fin
        ,   geom
        ) 
    AS  (   SELECT  MAX(code_zone)  OVER () AS  profondeur
                ,   code_zone
                ,   id_nd_ini
                ,   id_nd_fin
                ,   geom
            FROM    essai_pl
        UNION ALL
            SELECT  MAX(code_zone)  OVER () AS  profondeur
                ,   e.code_zone
                ,   e.id_nd_ini
                ,   e.id_nd_fin
                ,   e.geom
            FROM    en_aval  AS ea
                INNER JOIN
                    essai_pl AS e 
                    ON  e.id_nd_fin = ea.id_nd_ini
        )
    SELECT  ROW_NUMBER() OVER()::integer AS gid
        ,   profondeur
        ,   code_zone
        ,   id_nd_ini
        ,   id_nd_fin
        ,   geom 
    FROM    en_aval
    ;
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  7. #7
    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 ben c'est vrai que c'est dur ! LOL !

    Et ben merci bien, c'est exactement ce que je voulais...

    Bonne journée à vous ! Au revoir !

  8. #8
    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
    Bonjour à tous !

    Je réécrit sur ce post, parce que finalement, la réponse de al1_24 n'est pas vraiment celle que j'escomptais.
    Ma question était de savoir comment en peut nommer une récursivité, comme je l'ai schématisé ici :

    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
     
    récursivité de la zone X348
    1;1;"X340"
    2;1;"X341"
    3;1;"X342"
    4;1;"X343"
    5;1;"X345"
    6;1;"X346"
    7;1;"X348"
     
    récursivité de la zone X346
    8;2;"X340"
    9;2;"X341"
    10;2;"X343"
    11;2;"X342"
    12;2;"X345"
    13;2;"X346"
     
    récursivité de la zone X345
    14;3;"X340"
    15;3;"X341"
    16;3;"X343"
    17;3;"X342"
    18;3;"X345"
     
    récursivité de la zone X343
    19;4;"X340"
    20;4;"X341"
    21;4;"X343"
    22;4;"X342"
     
    récursivité de la zone X342
    23;5;"X340"
    24;5;"X341"
    25;5;"X342"
     
    récursivité de la zone X341
    26;6;"X340"
    27;6;"X341"
     
    récursivité de la zone X340
    28;7;"X340"

    Moi je voudrais qu'il me donne :

    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
     
    récursivité de la zone X348
    1;"X348";"X340"
    2;"X348";"X341"
    3;"X348";"X342"
    4;"X348";"X343"
    5;"X348";"X345"
    6;"X348";"X346"
    7;"X348";"X348"
     
    récursivité de la zone X346
    8;"X346";"X340"
    9;"X346";"X341"
    10;"X346";"X343"
    11;"X346";"X342"
    12;"X346";"X345"
    13;"X346";"X346"
     
    récursivité de la zone X345
    14;"X345";"X340"
    15;"X345";"X341"
    16;"X345";"X343"
    17;"X345";"X342"
    18;"X345";"X345"
     
    récursivité de la zone X343
    19;"X343";"X340"
    20;"X343";"X341"
    21;"X343";"X343"
    22;"X343";"X342"
     
    récursivité de la zone X342
    23;"X342";"X340"
    24;"X342";"X341"
    25;"X342";"X342"
     
    récursivité de la zone X341
    26;"X341";"X340"
    27;"X341";"X341"
     
    récursivité de la zone X340
    28;"X340";"X340"

    al1_24 m'avais conseillé d'utiliser la fonction "MAX(code_zone) OVER () AS profondeur". Sauf que c'est un hasard ici, si la zone sur laquelle s'effectue la récursivité est a tout le temps la nomenclature maximum par rapport aux autres zones. J'ai des cas, sur ma table entière où certaines zones ne sont pas maximum (dans leur nomenclature) face aux autres.

    Je voudrais donc savoir comment récupérer la zone de la récursion pour la retourner sur une colonne comme l'indique mon deuxième tableau.

    Merci de vos réponses.

  9. #9
    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
    bonjour,


    fournissez un exemple de donnée de votre cas particulier

  10. #10
    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 par exemple, dans mes code_zone, j'ai :
    X340, X341, X342, X343, X345, X346, X348, X 350, V700, V720 et V730.

    Voici la récursivité sur V720, par exemple :

    X340
    X341
    X342
    X343
    X345
    X346
    X348
    X350
    V700
    V720

    Si je fais la fonction "MAX(code_zone) OVER ()", au lieu de m'indiquer V720 sur chacune des lignes de cette récursivité, il va m'indiquer X350. Ce qui est logique, puisque X350 est le maximum de tous ces nombres (X est après V dans l'alphabet et 350 dessus tous les autres numéros de X).
    Je voudrais savoir comment lui dire d'indiquer V720 au lieu de X350.

    Merci.

  11. #11
    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
    oki,


    une autre approche que Al1_24.

    Création d'une vue pour définir l'ordre des lignes à traiter.

    Ici il y a deux notions importantes, la partition et l'order by.
    Dans votre cas je penses qu'il est intéressant d'avoir l'order by sur le timestamp de début ou de fin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    create view v_test as 
    with tmp as (
    select 1 as id, 1 as profondeur, 'X340' as code_zone union all
    select 2,1,'X341' union all
    select 3,1,'X343'  union all
    select 4,1,'X342' union all
    select 5,1,'X345'union all
    select 6,1,'X346' )
    select id, profondeur, code_zone, 
    row_number() over(partition by profondeur order by id desc) as rnk_desc
    from tmp;

    Ensuite, on peut appliquer la récursivité sur cette vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    with recursive rec (id, profondeur, code_zone_max, code_zone, rnk_link) as (
    select id, profondeur, code_zone, code_zone, rnk_desc
    from v_test
    where rnk_desc = 1
    union all
    select b.id, a.profondeur, a.code_zone_max, b.code_zone, b.rnk_desc
    from rec a
    inner join v_test b on a.profondeur = b.profondeur and a.rnk_link + 1 = b.rnk_desc)
    select * 
    from rec
    order by profondeur, rnk_link desc;

  12. #12
    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
    Lorsque je teste votre deuxième fonction, je n'ai qu'une récursivité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    id, profondeur, code_zone_max, code_zone, rnk_link
    6;1;"X346";"X346";1
    5;1;"X346";"X345";2
    4;1;"X346";"X342";3
    3;1;"X346";"X343";4
    2;1;"X346";"X341";5
    1;1;"X346";"X340";6
    De plus, il faut savoir que j'ai restreint les données pour effectuer les calculs sur une seule suite de tronçon hydrographique, mais ma table contient 279 lignes de tronçons hydrographiques. Du coup, je me vois mal écrire 279 fois votre première fonction. J'aimerais bien automatiser la chose.

    Enfin, pour la récursivité, je joins avec id_nd_fin=id_nd_ini et non a.profondeur=b.profondeur.

  13. #13
    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
    indiquez le code de création de vue que vous avez executé, et aussi quelle condition détermine le début d'une recursion.

    La partie union all de la vue est a omettre dans votre cas, j'ai utilisé ca comme jeu de test

  14. #14
    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
    Néanmoins, je pense avoir compris la philosophie de vos fonctions et j'effectue des tests dans leur sens. Je vous préviens de ce que je trouve...

  15. #15
    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
    Punkoff,

    Je viens de faire des test de vos fonctions en automatisant le processus. Pour vous expliquer le code de création de vue que j'ai utilisé, voici le tableau :

    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
    code_hydro, c_hyd_cdo, lettre_bv, toponyme1 ne nous intéressent pas.

    Je crée ensuite la première récursivité, comme dans votre 1ère fonction, mais en automatisant le processus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE or replace VIEW init_recurs_join as
    WITH recursive rec (gid, profondeur, code_zone, lettre_bv, fpkh, tpkh, id_nd_ini, id_nd_fin) AS (
    SELECT gid, 1, code_zone, lettre_bv, fpkh, tpkh, id_nd_ini, id_nd_fin
    FROM init_recurs_ord
    union ALL
    SELECT b.gid, a.profondeur +1, b.code_zone, b.lettre_bv, b.fpkh, b.tpkh, b.id_nd_ini, b.id_nd_fin
    FROM init_recurs_ord b
    INNER JOIN rec a ON b.id_nd_fin = a.id_nd_ini )
    SELECT gid, profondeur, code_zone, lettre_bv, fpkh, tpkh, id_nd_ini, id_nd_fin,
    row_number() over(partition BY profondeur ORDER BY gid desc) AS rnk_desc
    FROM rec
    Le "ON b.id_nd_fin=a.id_nd_ini" correspond au faite que ma table initiale correspond à des tronçons hydrographiques. Chaque extrémité de ceux-ci est identifié par id_nd_ini, pour l'extrémité la plus en amont et id_nd_fin pour l'extrémité la plus en aval. Ainsi, en appliquant "ON b.id_nd_fin=a.id_nd_ini", on demande de faire une jointure tant que l'identifiant de l'extrémité en aval d'un tronçon est égal à l'identifiant en amont du suivant.

    Après avoir appliquer ce code, j'obtient :

    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
     
    gid, profondeur, code_zone, lettre_bv, id_nd_ini, id_nd_fin, rnk_desc
    12;1;"V730";"V";619003051;619005470;1
    11;1;"V721";"V";619002712;619003051;2
    10;1;"V720";"V";619001184;619002712;3
    9;1;"V700";"V";614010566;619001184;4
    8;1;"X350";"X";619000786;614010566;5
    7;1;"X348";"X";619000784;619000786;6
    6;1;"X346";"X";619000560;619000784;7
    5;1;"X345";"X";615009286;619000560;8
    4;1;"X343";"X";615009662;615009286;9
    3;1;"X342";"X";615009013;615009662;10
    2;1;"X341";"X";614009387;615009013;11
    1;1;"X340";"X";614008612;614009387;12
    11;2;"V721";"V";619002712;619003051;1
    10;2;"V720";"V";619001184;619002712;2
    9;2;"V700";"V";614010566;619001184;3
    8;2;"X350";"X";619000786;614010566;4
    7;2;"X348";"X";619000784;619000786;5
    6;2;"X346";"X";619000560;619000784;6
    5;2;"X345";"X";615009286;619000560;7
    4;2;"X343";"X";615009662;615009286;8
    3;2;"X342";"X";615009013;615009662;9
    2;2;"X341";"X";614009387;615009013;10
    1;2;"X340";"X";614008612;614009387;11
    etc...
    Jusqu'ici, donc tout va bien.
    Cela ce complique lorsque j'aborde votre deuxième fonction.
    En écrivant exactement la même en remplaçant seulement vos nomenclatures par les miennes, par le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    WITH recursive rec (gid, profondeur, code_zone_max, code_zone, lettre_bv, id_nd_ini, id_nd_fin, rnk_link) AS (
    SELECT gid, profondeur, code_zone, code_zone, lettre_bv, id_nd_ini, id_nd_fin, rnk_desc
    FROM init_recurs_join
    WHERE rnk_desc = 1
    union ALL
    SELECT b.gid, a.profondeur, a.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_join b ON a.profondeur = b.profondeur AND a.rnk_link + 1 = b.rnk_desc)
    SELECT * 
    FROM rec
    J'obtient la table 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
    25
    26
     
    gid, profondeur, code_zone_max, code_zone, lettre_bv, id_nd_ini, id_nd_fin, rnk_link
    12;1;"V730";"V730";"V";619003051;619005470;1
    11;2;"V721";"V721";"V";619002712;619003051;1
    10;3;"V720";"V720";"V";619001184;619002712;1
    9;4;"V700";"V700";"V";614010566;619001184;1
    8;5;"X350";"X350";"X";619000786;614010566;1
    7;6;"X348";"X348";"X";619000784;619000786;1
    6;7;"X346";"X346";"X";619000560;619000784;1
    5;8;"X345";"X345";"X";615009286;619000560;1
    4;9;"X343";"X343";"X";615009662;615009286;1
    3;10;"X342";"X342";"X";615009013;615009662;1
    2;11;"X341";"X341";"X";614009387;615009013;1
    1;12;"X340";"X340";"X";614008612;614009387;1
    11;1;"V730";"V721";"V";619002712;619003051;2
    10;2;"V721";"V720";"V";619001184;619002712;2
    9;3;"V720";"V700";"V";614010566;619001184;2
    8;4;"V700";"X350";"X";619000786;614010566;2
    7;5;"X350";"X348";"X";619000784;619000786;2
    6;6;"X348";"X346";"X";619000560;619000784;2
    5;7;"X346";"X345";"X";615009286;619000560;2
    4;8;"X345";"X343";"X";615009662;615009286;2
    3;9;"X343";"X342";"X";615009013;615009662;2
    2;10;"X342";"X341";"X";614009387;615009013;2
    1;11;"X341";"X340";"X";614008612;614009387;2
    etc...
    Ainsi, lorsque dans votre cas, la colonne profondeur s'incrémentait après chaque récursivité et la colonne code_zone_max prenait la valeur du code_zone où la récursivité était effectuée, pour moi la colonne profondeur devient la colonne rnk_link et vice versa, et la colonne code_zone_max est la copie conforme de la colonne code_zone.
    Lorsque ça marche, presque miraculeusement chez vous, chez moi, ça foire totalement.
    Je ne comprends pas ce que j'ai fait de mal par rapport à vous. Pouvez-vous me dire quoi changer, s'il vous plait ?

  16. #16
    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 viens de remarquer que lorsque je teste la partie de la deuxième requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT gid, profondeur, code_zone, code_zone, lettre_bv, id_nd_ini, id_nd_fin, rnk_desc
    FROM init_recurs_join
    WHERE rnk_desc = 1
    Il me donne :

    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;1
    10;3;"V720";"V720";"V";619001184;619002712;1
    9;4;"V700";"V700";"V";614010566;619001184;1
    8;5;"X350";"X350";"X";619000786;614010566;1
    7;6;"X348";"X348";"X";619000784;619000786;1
    6;7;"X346";"X346";"X";619000560;619000784;1
    5;8;"X345";"X345";"X";615009286;619000560;1
    4;9;"X343";"X343";"X";615009662;615009286;1
    3;10;"X342";"X342";"X";615009013;615009662;1
    2;11;"X341";"X341";"X";614009387;615009013;1
    1;12;"X340";"X340";"X";614008612;614009387;1
    Tandis que chez vous, elle donnait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    6;1;"X346";"X346";1
    Je pense que c'est de là que ça vient, le problème que je rencontre sur le deuxième code.
    Je continue de tester en espérant votre réponse...

  17. #17
    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 vous avez totallement cassé la logique.

    La vue permet de trier par partition de donnée les différentes plage de profondeur (il n'y a aucune récursion dans cette vue)


    La récursion permet de regrouper les différentes plage en partant du bout de l'arbre, puis de le remonter.


    C'est pour ca que je vous ai demandé plus haut :
    quelle condition détermine le début d'une recursion ?

  18. #18
    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 dû bien comprendre.

    Petit rectificatif, ce que je veux faire, c'est commencer au bas de l'arbre pour finir aux branches.

    Sinon, pour la réponse à votre question, je réécris ce que j'ai écris dans mon dernier message :

    Le "ON b.id_nd_fin=a.id_nd_ini" correspond au faite que ma table initiale correspond à des tronçons hydrographiques. Chaque extrémité de ceux-ci est identifié par id_nd_ini, pour l'extrémité la plus en amont et id_nd_fin pour l'extrémité la plus en aval. Ainsi, en appliquant "ON b.id_nd_fin=a.id_nd_ini", on demande de faire une jointure tant que l'identifiant de l'extrémité en aval d'un tronçon est égal à l'identifiant en amont du suivant.

    Du coup, la condition qui détermine le début de la récursion est que b.id_nd_fin=a.id_nd_ini.
    C'est-à-dire que l'identifiant de l'extrémité en aval du tronçon en amont est égal à l'identifiant de l'extrémité en amont du tronçon en aval.

  19. #19
    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
    Du coup, je viens de faire la fonction :

    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, profondeur, 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, a.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 AND a.rnk_link + 1 = b.rnk_desc)
    SELECT * FROM rec
    Je fais cette fonction en première occurence et ça me donne comme le résultat de votre 2e fonction, c'est-à-dire :

    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;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
    Donc, je n'ai, ici, qu'une seule récursivité. J'aimerais savoir comment avoir les autres.

    Merci à vous de prendre mon cas avec autant d'importance.

  20. #20
    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 précise que j'aimerais comment avoir les autres, dans le même script...
    J'ai 280 tronçons, je ne vais pas les faire un par un.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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