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

Langage SQL Discussion :

Arbres en SQL (à propos de l'article de SQLpro)


Sujet :

Langage SQL

  1. #1
    Membre averti Avatar de ner0lph
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 436
    Points
    436
    Par défaut Arbres en SQL (à propos de l'article de SQLpro)
    Bonjour,

    J'ai lu avec attention l'article de SQLpro sur la représentation d'un arbre par intervalles.

    http://sqlpro.developpez.com/cours/arborescence/

    Cependant, malgré les nombreux exemples d'insertion et de suppression, je n'arrive pas à comprendre comment déplacer un élément.
    J'ai d'abord pensé à le supprimer puis à le réinsérer au bon endroit avec le bon parent, mais ça me semble tiré par les cheveux, surtout si cette élément est un nœud avec des enfants.

    J'avais donc l'intention de créer une procédure* supplémentaire concernant le déplacement d'éléments.

    Mais je bloque sur la logique. Alors plutôt que faire fausse route (surtout que je pense à perdre trop de temps à réfléchir, et j'ai pas mal de boulot qui m'attend), je me permets de vous demander des conseils.

    Donc, quels conseils et orientations pourriez-vous me donner ?

    ____
    * non stockée, mais en WLangage ; j'utilise Oracle 10.2 et je ne suis pas le DBA (donc je n'ai que le pouvoir de demander la création d'une table et l'utiliser, point ; p.-ê. un proc. sto. en négociant mais...).

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 739
    Points
    11 739
    Par défaut
    En première approche, je dirais ça... il y a peut-être des implications que je rate :

    Supposons que tu veuilles déplacer un élément qui a un LB de 10 vers un emplacement où son LB serait 20, et que cet élément ait 2 enfants, ce qui donne en tout 3 éléments déplacés. Cela devrait donner :

    • Les éléments avec un LB < 10 sont inchangés
    • Ceux qui ont un LB entre 11 et 19 et qui ne sont pas des descendants de l'élément déplacé doivent décrémenter de 6 leur LB et leur RB
    • Ceux qui ont un LB >= 20 et qui ne sont pas des descendants de l'élément déplacé doivent incrémenter de 6 leur LB et leur RB
    • L'élément déplacé et ses descendants incrémentent leur LB et leur RB de 10


    Tu peux faire le raisonnement inverse avec un déplacement vers la gauche, par exemple l'élément LB = 20 devient l'élement LB = 10.

  3. #3
    Membre averti Avatar de ner0lph
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 436
    Points
    436
    Par défaut
    Bonjour à tous les deux,

    À Antoun, merci pour tes pistes que je vais explorer.

    À SQLpro, je vous envoie un mail tout de suite.

    Merci à tous les deux.

  4. #4
    Membre averti Avatar de ner0lph
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 436
    Points
    436
    Par défaut
    Ok, je procède tout de même partiellement à une réflexion, car j'en ai besoin.

    Néanmoins, j'attends avec impatience votre mail afin de me corriger.

  5. #5
    Membre averti Avatar de ner0lph
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 436
    Points
    436
    Par défaut Manque @nivd
    Bonjour,

    J'ai implanté le déplacement, mais il y a une erreur : le déplacement récursif par fils (ainé ou cadet) se trompe : il ne met pas correctement à jour le niveau. Or, je me sert du niveau pour gérer l'affichage (en WinDev 11)…
    Je cherche mais je ne comprends pas tout.

    Une solution ?

    Autre question en rapport : est-il possible de renuméroter les niveaux en fonction des bornes ?

    ----

    Edit : Pour la 1re question, j'ai trouvé ! Au niveau du « Recadrage de la liste d'éléments déplacés » (dans FC et FA récursifs), il fallait remplacer :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE T_FAMILLE_FML
        SET FML_BG = FML_BG - @deltab,
            FML_BD = FML_BD - @deltab,
            FML_NIVEAU = FML_NIVEAU + @nivp + 1
        WHERE FML_BG > @bdmax
    par
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE T_FAMILLE_FML
        SET FML_BG = FML_BG - @deltab,
            FML_BD = FML_BD - @deltab,
            FML_NIVEAU = FML_NIVEAU - @nivd + @nivp + 1
        WHERE FML_BG > @bdmax
    Fin Edit

  6. #6
    Membre averti Avatar de ner0lph
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 277
    Points : 436
    Points
    436
    Par défaut
    Donc, est-il possible de renuméroter les niveaux en fonction des bornes ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Méta Données]A Propos de l'article SqlPro ...
    Par AngelFlo dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/07/2006, 13h08
  2. [PL/SQL] à propos du package DBMS_XMLQuery
    Par moneyinthebank dans le forum Oracle
    Réponses: 2
    Dernier message: 20/06/2006, 14h50
  3. parcours d'un arbre en sql
    Par dor_boucle dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/02/2006, 12h10
  4. A propos de l'article de PRomu@ld sur l'allocation memoire
    Par Emmanuel Delahaye dans le forum C
    Réponses: 2
    Dernier message: 09/01/2006, 17h44

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