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 :

Select avec condition sur hiérarchie ascendante


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2006
    Messages : 188
    Par défaut Select avec condition sur hiérarchie ascendante
    Bonjour

    en oracle v8.1.7

    je voudrais pouvoir lister tous les enregistrements dont au moins un ascendant hierarchique est de type 'XF' quel que soit le niveau.




    table enreg

    champs

    enreg_sup,
    enreg_no,
    enreg_type,
    enreg_date

    est ce possible avec
    connect by prior enreg_sup=enreg_no?

    je ne sais pas comment mettre des conditions



    je pourrai eventuellement fixer 3 niveaux maximum :
    une table enreg n1, un table enreg n2 et une table enreg n3

    et faire des jointures mais je ne vois pas plus comment faire la clause WHERE

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 66
    Par défaut
    Yo
    c'est ça que tu veux??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select 
    	eINF.*:)
    from
    	enreg eINF
    	join enreg eSUP on eSUP.enreg_no=eINF.enreg_sup
    where
    	eSUP.enreg_type='XF'
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select 
    	eINF.*
    from
    	enreg eINF
    	,enreg eSUP
    where
    	eSUP.enreg_no=eINF.enreg_sup
    	and eSUP.enreg_type='XF'
    Pour 3 niveaux c'est un peu le même principe, je te met qu'une méthode sur les 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select 
    	eINF.*
    from
    	enreg eINF
    	,enreg eSUP
    	,enreg eSUP2
    where
    	eSUP.enreg_no=eINF.enreg_sup
    	and eSUP2.enreg_no=eSUP.enreg_sup
    	and eSUP.enreg_type='XF'
    	and eSUP2.enreg_type='XF'

  3. #3
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2006
    Messages : 188
    Par défaut
    ok pour le 3eme avec 3 niveaux

    par contre avec les 2 premiers exemples pour x niveaux on ne liste les enreg que si le pere direct est de type "XF"

    je veux pouvoir lister tous les enreg dont un ascendant (au moins) de niveau n est de type "XF"

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2006
    Messages : 66
    Par défaut
    ah d'accord,
    Je replonge dans mes cours de requête hiérarchique...
    j'avais jamais appliqué ça avant.
    ça donne un truc du style


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT LEVEL,*
    FROM enreg
    CONNECT BY enreg_sup=PRIOR enreg_no	
    START WITH enreg_type='XF'
    WHERE LEVEL <=n --Mais je ne suis pas sur de la clause Where
     
    ;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT LEVEL,*
    FROM enreg
    CONNECT BY enreg_sup=PRIOR enreg_no	
    START WITH enreg_type='XF' and LEVEL <=n 
    ;
    ça marche??ou pas?

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Salut,

    Si le jeu de test ci dessous correspond à tes données, je te propose cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select no,sup,typ
    from t
    start with no in (select no from t where typ='XF')
    connect by prior no=sup
    Et les tests :

    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
     
    create table t (sup int,no int,typ varchar(5));
    insert into t values (0,1,'A');
    insert into t values (1,2,'B');
    insert into t values (1,3,'XF');
    insert into t values (2,4,'XF');
    insert into t values (3,5,'Z');
    insert into t values (4,6,'Z');
    insert into t values (2,7,'Z');
     
     
     
    SQL> select * from t;
     
           SUP         NO TYP
    ---------- ---------- -----
             0          1 A
             1          2 B
             1          3 XF
             2          4 XF
             3          5 Z
             4          6 Z
             2          7 Z
     
    7 ligne(s) s�lectionn�e(s).
     
    SQL> select no,sup,typ
    from t
    start with no in (select no from t where typ='XF')
    connect by prior no=sup  2    3    4  ;
     
            NO        SUP TYP
    ---------- ---------- -----
             3          1 XF
             5          3 Z
             4          2 XF
             6          4 Z
    Par contre attention au premier élément, est il son propre père?

    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
     
    SQL> update t set typ='XF', sup=1 where no=1;
     
    1 ligne mise � jour.
     
    SQL> commit;
     
    Validation effectu�e.
     
    SQL> select no,sup,typ
    from t
    start with no in (select no from t where typ='XF')
    connect by prior no=sup  2    3    4  ;
    ERROR:
    ORA-01436: boucle CONNECT BY dans les donn�es utilisateur

  6. #6
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2006
    Messages : 188
    Par défaut
    ok merci çà donne le resultat attendu

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 08/08/2011, 11h42
  2. probleme avec condition sur resultat d'un SELECT
    Par mabrouk1987 dans le forum Général Java
    Réponses: 0
    Dernier message: 06/04/2010, 10h06
  3. Select, avec conditions sur 4 champs simultanément
    Par byrdo dans le forum Langage SQL
    Réponses: 10
    Dernier message: 22/09/2009, 18h13
  4. Réponses: 0
    Dernier message: 05/02/2008, 10h09
  5. Réponses: 6
    Dernier message: 08/06/2004, 14h51

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