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 :

Utiliser des jointures de table avec une fonction r�cursive


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    13
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 13
    Par d�faut Utiliser des jointures de table avec une fonction r�cursive
    Bonjour � tous,

    Je suis en train d'utiliser la fonctionnalit� d'oracle sur la r�cursivit�.
    Ca marche tr�s bien lorsque j'utilise ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    select SYS_CONNECT_BY_PATH(ih.child_id, ' - '), level
    from INV_HIERARCHIES ih
    start with ih.parent_id = 5011528
    connect by prior ih.child_id = ih.parent_id
    En revanche lorsque je veux utiliser une jointure avec une autre table comment faire?
    Ceci ne marche pas :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    select SYS_CONNECT_BY_PATH(ih.child_id, ' - '), level, ii.NAME
    from INV_INVESTMENTS ii,
         INV_HIERARCHIES ih
    start with ih.parent_id = 5011528
    connect by prior ih.child_id = ih.parent_id
    where ii.id = ih.child_id
    Quelqu'un peut-il m'aider sur la bonne syntaxe?

    Merci beaucoup.
    Eric.

  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
    En positionnant bien le WHERE :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    select SYS_CONNECT_BY_PATH(ih.child_id, ' - '), level, ii.NAME
    from INV_INVESTMENTS ii,
    INV_HIERARCHIES ih
    where ii.id = ih.child_id
    start with ih.parent_id = 5011528
    connect by prior ih.child_id = ih.parent_id
    Ou mieux :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
        select sys_connect_by_path(ih.child_id, ' - '), level, ii.name
          from inv_investments ii
               inner join inv_hierarchies ih
                 on ih.child_id = ii.id
    START with ih.parent_id = 5011528
    CONNECT by PRIOR ih.child_id = ih.parent_id
    Notez bien aussi les remarques suivantes tir�es de la documentation officielle :
    Oracle processes hierarchical queries as follows:
    * A join, if present, is evaluated first, whether the join is specified in the FROM clause or with WHERE clause predicates.
    * The CONNECT BY condition is evaluated.
    * Any remaining WHERE clause predicates are evaluated.

  3. #3
    Membre �clair�
    Inscrit en
    Juillet 2006
    Messages
    76
    D�tails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Par d�faut
    Oracle processes hierarchical queries as follows:
    * A join, if present, is evaluated first, whether the join is specified in the FROM clause or with WHERE clause predicates.
    * The CONNECT BY condition is evaluated.
    * Any remaining WHERE clause predicates are evaluated.
    Ca devrait eviter la jointure a faire avant la recherche recursive.

    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
    WITH INV_HIERARCHIES AS
    (
    SELECT 1 AS id,null AS child_id FROM dual union ALL
    SELECT 2 , 1 FROM dual union ALL
    SELECT 3 , 1 FROM dual union ALL
    SELECT 4 , 2 FROM dual
    ),
    INV_INVESTMENTS AS
    (
    SELECT 1 AS id,'Durand' AS name FROM dual union ALL
    SELECT 2 ,'Dufour' FROM dual union ALL
    SELECT 3 ,'Cheng' FROM dual union ALL
    SELECT 4 ,'Moise' FROM dual
    )
    select hier,lv,name
    from
    (
    SELECT SYS_CONNECT_BY_PATH(ih.child_id, ' - ') as hier, level as lv, ih.id
    FROM INV_HIERARCHIES ih
    start WITH ih.id = 1
    connect BY prior ih.id = ih.child_id
    ) req JOIN INV_INVESTMENTS ii ON ii.id = req.id

  4. #4
    Expert confirm� Avatar de mnitu
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par d�faut
    Citation Envoy� par boutade80 Voir le message
    Ca devrait eviter la jointure a faire avant la recherche recursive.
    ...
    Oui mais, �a ne donne pas forcement le m�me r�sultat.

Discussions similaires

  1. R�ponses: 6
    Dernier message: 29/10/2014, 21h26
  2. R�ponses: 7
    Dernier message: 15/07/2011, 15h22
  3. [XL-2003] utiliser des chiffres a virgules avec une inputbox
    Par bosk1000 dans le forum Macros et VBA Excel
    R�ponses: 7
    Dernier message: 16/06/2011, 08h56
  4. Permutation avec une fonction r�cursive
    Par nypahe dans le forum D�buter avec Java
    R�ponses: 1
    Dernier message: 29/04/2009, 07h32
  5. [D�butant] Utiliser des listes en argument d'une fonction
    Par erkenbrand dans le forum Windows Forms
    R�ponses: 10
    Dernier message: 29/05/2008, 12h56

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