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

Oracle Discussion :

[Oracle 10g] Requête hiérachique et fils masqués


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut [Oracle 10g] Requête hiérachique et fils masqués
    Bonjour,

    Je cherche à savoir s'il est possible de retourner via Oracle le résultat d'un arbre en masquant un fils tout en gardant la relation.
    Exemple :
    Arbre initial :
    Contenu en base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Père  Fils
    ----  ----
     1     2
     2     3
     3     4
    Je décide de ne pas afficher 3 :
    Contenu souhaité retourné par requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Père  Fils
    ----  ----
     1     2
     2     4
    Est-ce faisable ?

    Si oui quelle est la requête permettant de faire ça ?


    J'ai tenté en mettant la condition d'exclusion dans la clause where, les relations sont conservées mais le résultat retourné est...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Père  Fils
    ----  ----
     1     2
     3     4
    Or 3 n'existe pas donc le lien est cassé.


    Ma base de donnée est composée d'une table OBJET contenant les objets (pères et fils) et une table RELATION contenant uniquement l'idpere et l'idfils.
    Mon boolean d'affichage est dans une troisième table CAPTEUR, la jointure se faisant sur un attribut codecapteur de OBJET.
    Structures des tables (en souligné la clé primaire, en italique la clé étrangère) :
    OBJET : identifiant (int) | nom (varchar) | codecapteur (varchar)
    RELATION : idpere (int) | idfils (int)
    CAPTEUR : codecapteur (varchar) | affichable (boolean)

  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
    Je pense que votre cas de figure est un peu trop simplifié.

    La solution qui a mon avis n'en est pas une car codée en dur :
    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
    with relation as
    (
    select 1 as idpere, 2 as idfils from dual union all
    select 2          , 3           from dual union all
    select 3          , 4           from dual
    )
        select case idpere when 3 then lag(idfils) over(order by level) else idpere end as idpere
             , idfils
          from relation
     where idfils <> 3
    start with idpere = 1 
    connect by prior idfils = idpere;
     
        IDPERE     IDFILS
    ---------- ----------
             1          2
             2          4

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut
    Effectivement, le cas décrit est un peu trop simpliste.

    Je précise donc :
    Arbre initial :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    106
    |- 234
       |- 312
          |- 681
    Contenu en base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Père  Fils
    ----  ----
     106   234
     234   312
     312   681
    Je ne dois pas afficher 312 car il possède le codecapteur "TOTO" qui a une valeur affichable à 0 :
    Contenu souhaité retourné par requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Père  Fils
    ----  ----
     106   234
     234   681
    Il est possible que 234 ait aussi un codecapteur ("TITI") avec une valeur affichable à 0.
    Du coup le contenu souhaité serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Père  Fils
    ----  ----
     106   681

    La requête ne peut donc être écrite "en dur" puisque dépendant du codecapteur.


    Cependant, merci de m'avoir fait découvrir la fonction lag qui devrait pouvoir m'aider...

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    with tmp as(
       select level as pere, level+1 as fils, mod(level,5) as code_capteur from dual connect by level<10)
    select  pere, fils,code_capteur from 
       (select pere, fils, code_Capteur, rownum as champ_tri from tmp connect by pere= prior fils start with pere=1) t1
    where t1.code_capteur <>2 order by t1.champ_tri;
    Avec ca pour le with:
    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
    TMP>with tmp as(
      2     select level as pere, level+1 as fils, mod(level,5) as code_capteur from dual connect by level<10)
      3        select * from tmp;
     
          PERE       FILS CODE_CAPTEUR
    ---------- ---------- ------------
             1          2            1
             2          3            2
             3          4            3
             4          5            4
             5          6            0
             6          7            1
             7          8            2
             8          9            3
             9         10            4
     
    9 rows selected.
    Apres pour exclure les lignes qui ne vont pas en fonction du code capteur, il y a plein de solutions

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 36
    Par défaut
    Merci pour ta réponse, Rams7s.

    Toutefois, je suis un peu dubitatif. J'arrive à avoir un arbre retourné par requête.

    Ce que je n'arrive pas à avoir, c'est un arbre avec des relations conservées malgré l'absence de certains noeuds.

    Ci-joint le code SQL de création de ma base (simplifié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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    CREATE TABLE CAPTEUR
    (
      CAPTEURCODE       VARCHAR2(64 BYTE)           NOT NULL,
      AFFICHECAPTEUR    NUMBER
    )
    LOGGING 
    NOCOMPRESS 
    NOCACHE
    NOPARALLEL
    MONITORING;
     
     
    ALTER TABLE CAPTEUR ADD (
      CONSTRAINT PK_CAPTEURCODE
     PRIMARY KEY
     (CAPTEURCODE));
     
    CREATE TABLE OBJET
    (
      OBJETID             NUMBER                    NOT NULL,
      OBJETDATE           DATE                      NOT NULL,
      CAPTEURCODE   VARCHAR2(64 BYTE)
    )
    LOGGING 
    NOCOMPRESS 
    NOCACHE
    NOPARALLEL
    MONITORING;
     
     
    ALTER TABLE OBJET ADD (
      CONSTRAINT PK_OBJET
     PRIMARY KEY
     (OBJETID));
     
     
    ALTER TABLE OBJET ADD (
      CONSTRAINT FK_OBJET_COMPOSE2_CAPTEUR 
     FOREIGN KEY (CAPTEURCODE) 
     REFERENCES CAPTEUR (CAPTEURCODE));
     
    CREATE TABLE RELATION
    (
      PERETACHEID  NUMBER,
      FILSTACHEID  NUMBER                           NOT NULL
    )
    LOGGING 
    NOCOMPRESS 
    NOCACHE
    NOPARALLEL
    MONITORING;
     
     
    ALTER TABLE RELATION ADD (
      CONSTRAINT PK_TABLERELATION
     PRIMARY KEY
     (PERETACHEID, FILSTACHEID) DISABLE);
     
    ALTER TABLE RELATION MODIFY CONSTRAINT PK_TABLERELATION RELY;
     
    ALTER TABLE RELATION ADD (
      CONSTRAINT FK_RELATION_RELATION1_OBJET 
     FOREIGN KEY (PERETACHEID) 
     REFERENCES OBJET (OBJETID));
     
    ALTER TABLE RELATION ADD (
      CONSTRAINT FK_RELATION_RELATION2_OBJET 
     FOREIGN KEY (FILSTACHEID) 
     REFERENCES OBJET (OBJETID));
     
    ALTER TABLE RELATION MODIFY CONSTRAINT PK_TABLERELATION RELY;

  6. #6
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Citation Envoyé par Doc.Fusion Voir le message
    Merci pour ta réponse, Rams7s.

    Toutefois, je suis un peu dubitatif. J'arrive à avoir un arbre retourné par requête.

    Ce que je n'arrive pas à avoir, c'est un arbre avec des relations conservées malgré l'absence de certains noeuds.
    Ce qu'on te suggère, c'est qu'il n'y a pas d'autre moyen de faire que de construire l'arbre, puis d'en exclure les élements indésirables, avec le filtre de ton choix.

    En reprenant l'exemple entamé, pour cadrer avec ton point :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    WITH tmp AS(
           SELECT level AS pere, level+1 AS fils, mod(level,5) AS code_capteur_pere, mod(level+1,5) as code_capteur_fils FROM dual connect BY level<10)
              SELECT * FROM tmp
              WHERE  code_capteur_fils <> 3
                  AND  code_capteur_pere <> 3;

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

Discussions similaires

  1. ORACLE 10G - Requête hiérarchique ?
    Par jacquesh dans le forum SQL
    Réponses: 2
    Dernier message: 06/05/2010, 11h16
  2. [Oracle 10g]Requête paramétrée
    Par peuplier dans le forum SQL
    Réponses: 6
    Dernier message: 02/04/2009, 09h36
  3. Réponses: 6
    Dernier message: 27/09/2007, 13h38
  4. [Oracle 10g] Problème Union-sous requêtes-group by
    Par slobberbone dans le forum SQL
    Réponses: 2
    Dernier message: 17/09/2007, 18h16
  5. [Oracle 10g] Temps d'exécution d'une requête
    Par tux2005 dans le forum Oracle
    Réponses: 5
    Dernier message: 31/08/2007, 13h42

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