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

SQL Oracle Discussion :

Parcours d'une hierarchie pour trouver un chemin unique (CTE, recursion, ...)


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Par défaut Parcours d'une hierarchie pour trouver un chemin unique (CTE, recursion, ...)
    Bonjour a tous,

    Je me casse la tête sur un problème depuis hier matin et je ne voie pas du tout comment le résoudre.

    Alors je m'explique :
    Je dois trouver le chemin unique entre deux tables d'une arborescence de plusieurs dizaines de tables. Ces deux tables pouvant être séparées par plusieurs autre tables.
    Je n'ai pour information que le nom de ces deux tables (table départ et arrivée), et, j'ai également en base les enregistrements entre chacune des tables de mon arborescences, notées sous la forme suivante :

    Le modèle que j'ai a la particularité de n'avoir qu'un seul chemin entre deux tables.

    Je pensait donc me servir des CTE afin de réaliser cette recherche mais n'ayant pas en base de lien père-fils cela ne donne rien.

    Mon but étant d'avoir a la fin (pas forcément présenté comme cela, c'est pour illustrer) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TABLE1-TABLEinter1 > TABLEinter1-TABLEinter2 > TABLEinter2-TABLEinter3 > TABLEinter3-TABLE2

    edit :
    J'ai une idée pour faire cela en code, mais cela impliquerai de lancer plusieurs centaines de requêtes au SGBD et de gros traitement code serveur. C'est pour cela que je souhaiterai le faire a partir du SQL directement.



    Quelqu'un aurait il une idée pour m'orienter.

    Merci d'avance

    Ghosty

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il semblerait que vous confondiez plusieurs notions ici.
    Une hiérarchie c'est une relation père-fils enregistrée dans la même table, qui pointe donc sur elle-même.

    On les interroge avec l'opérateur historique CONNECT BY ou plus récemment depuis 11gR2 avec les CTE récursives.

    Maintenant ce que vous avez l'air de rechercher ce sont les associations naturelles de vos tables.
    Là il faudrait vous référer à un MCD, mais j'imagine que vous n'en avez pas !

    Difficile de vous aider plus, car malheureusement nous ne possédons ni vos tables ni vos données. Si j'ai mal cerné votre problème n'hésitez pas à en dire plus.

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Par défaut
    Bonjour waldar,

    Je ne pense pas que tu ais mal compris, c'a doit plustot etre moi qui me suis mal exprimé...

    Enfin bon, effectivement je n'ai pas de mcd a proprement dit car ce que je dois réaliser devra pouvoir s'adapter a plusieurs modèle ne comprenant jamais les même tables.

    Je met en pièce jointe un exemple de shema que j'ai a parcourir pour exemple.

    Ce shema est une simple représentation graphique.

    Moi j'ai a ma disposition :
    table1 : SVT-CCLI
    table2 : SVT-HCS

    En base je vais avoir les éléments suivant :
    1 : SVT-CCLI-SVT-CLI;relation
    2 : SVT-CLI-SVT-DET;relation
    3 : SVT-DET-SVT-HCS: relation
    4....
    5....
    ainsi de suite, pour toutes les relations entre chaque table.

    Du coup moi a partir de mes deux tables j'aimerai récupérer mes 3 relations (pour l'exemple ci dessus) en passant par le SQL.

    Es-ce que c'est plus clair ??
    Images attachées Images attachées  

  4. #4
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Bonjour,

    Je partirai sur l'approche suivante :
    - transforme le champ de relation "TABLE1-TABLE2;RELATION" pour en sortir 2 champs TABLE_PERE ("TABLE1") et TABLE_FILLE ("TABLE2") avec des SUBSTR et INSTR,
    - sur cette vue implicite, faire une requête hiérarchique pour établir l'arborescence des dépendances,
    - filtrer sur le point de départ et d'arrivée

    A la fin, la requête devrait ressembler à quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with liens as (
      select substr (...) table_pere,
             substr (...) table_fille
      from ...)
    select *
    from (
          select table_pere, table_fille, sys_connect_by_path(table_fille, '-') chemin
          from liens
          connect by prior table_fille = table_pere
          start with table_pere = 'MA_TABLE_PERE_CHERCHEE')
    where table_fille = 'MA_TABLE_FILLE_CHERCHEE'
    Je n'ai pas testé, donc il y a probablement des erreurs de syntaxe, mais ça doit pouvoir donner une idée de départ.

  5. #5
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Par défaut
    bonjour et merci xdescamp

    Je vais essayer de tester cela.

    Mais toutes mes bases n'étant pas en 11gr2, est il possible de faire la même chose avec START WITH ..... CONNECT BY ???

  6. #6
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Citation Envoyé par ghosty177 Voir le message
    Mais toutes mes bases n'étant pas en 11gr2, est il possible de faire la même chose avec START WITH ..... CONNECT BY ???
    CONNECT BY est disponible depuis la 8i il me semble, 9i sûr.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    CONNECT BY est disponible depuis la v2 !

  8. #8
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    82
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 82
    Par défaut
    ok merci pour les info je regarderai ca plus tard.

    Je viens de tester la requete proposé par xdescamp et elle me retourne dans tous les cas 0 résultats...
    J'ai pris pour test un exemple avec seulement 1 table a trouver entre les deux

    Je pense que ca viens (pas certain du tout) de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    connect BY prior table_fille = table_pere
    Mais étant donné que je n'aurais jamais la table père et fille pour une relation, il me parait étrange que l'on puisse avoir égale...

    Qu'en pensez vous?


    La requête exécutée :

    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
     
    "WITH liens AS " +
    "( " +
    "SELECT " +
    "substr (vuegwsql, 3, 5) table_pere, " +
    "substr (vuegwsql, 9) table_fille " +
    "FROM gwsql " +
    ") " +
    "SELECT * " +
    "FROM " +
    "( " +
    "SELECT " +
    "table_pere, " +
    "table_fille, " +
    "sys_connect_by_path(table_fille, '/') chemin " +
    "FROM liens " +
    "CONNECT BY PRIOR table_fille LIKE table_pere " +
    "START WITH table_pere = 'SVT-CVF'" +
    ") " +
    "WHERE table_fille = 'SVT-REM' ";


    EDIT :
    J'ai tester la partie avec les substr et cela me retourne toutes les jointures avec la table père et fille découpée correctement.

    EDIT 2 :
    En fait je suis sur un base en 10.2. le souci viendrait il de la? pourtant la requête s'exécute sans erreur...

    EDIT 3 :
    J'ai également oublier de vous dire que les enregistrements de la base ne respecte pas forcément la règle PERE/FILLE dans le nommage. Il y en a également qui sont de type FILLE/PERE.

    J'ai donc rajouter au START WITH :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    START WITH table_pere = 'SVT-CVF' or table_fille = 'SVT-CVF'
    J'ai fait la même chose pour le WHERE de fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE table_fille = 'SVT-REM' or table_pere = 'SVT-REM'
    L'éxécution ne me retourne toujours pas d'enregistrements...

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 03/12/2009, 11h50
  2. Comparaison d'une valeur pour trouver la plus proche
    Par Falcdyr dans le forum VBA Access
    Réponses: 4
    Dernier message: 16/04/2008, 17h10
  3. Réponses: 7
    Dernier message: 30/03/2008, 14h07
  4. Rafraichir une animation pour changer le chemin d'un fichier externe
    Par nicolas2603 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 9
    Dernier message: 25/01/2008, 12h07
  5. Réponses: 3
    Dernier message: 31/05/2006, 11h43

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