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 :

Obtenir les feuilles d'une branche d'une représentation intervallaire bâtarde


Sujet :

Langage SQL

  1. #1
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut Obtenir les feuilles d'une branche d'une représentation intervallaire bâtarde
    Bonjour à tous,

    Je me trouve face à une gestion d'arbres par représentation intervallaire bâtarde. Qui pourrait se représenter comme suit :
    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 IF NOT EXISTS parent (
      PARENT_ID int(11) NOT NULL AUTO_INCREMENT,
      NFM_BG int(11) DEFAULT NULL,
      NFM_BD int(11) DEFAULT NULL,
      NFM_LIB varchar(16) DEFAULT NULL,
      PRIMARY KEY (PARENT_ID)
    )
     
    CREATE TABLE IF NOT EXISTS enfant (
      ID int(11) NOT NULL AUTO_INCREMENT,
      PARENT_ID int(11) NOT NULL,
      NFM_LIB varchar(16) DEFAULT NULL,
      PRIMARY KEY (ID)
    )
     
    INSERT INTO parent (PARENT_ID, NFM_BG, NFM_BD, NFM_LIB) VALUES (1, 1, 4, 'Aérien')
    INSERT INTO parent (PARENT_ID, NFM_BG, NFM_BD, NFM_LIB) VALUES (2, 2, 3, 'Avion')
    INSERT INTO parent (PARENT_ID, NFM_BG, NFM_BD, NFM_LIB) VALUES (3, 5, 8, 'Terrestre')
    INSERT INTO parent (PARENT_ID, NFM_BG, NFM_BD, NFM_LIB) VALUES (4, 6, 7, 'Moto')
    INSERT INTO parent (PARENT_ID, NFM_BG, NFM_BD, NFM_LIB) VALUES (5, 9, 10, 'Marin')
     
    INSERT INTO enfant (ID, PARENT_ID, NFM_LIB) VALUES (1, 1, 'Planeur')
    INSERT INTO enfant (ID, PARENT_ID, NFM_LIB) VALUES (2, 1, 'Parachute')
    INSERT INTO enfant (ID, PARENT_ID, NFM_LIB) VALUES (3, 1, 'Hélico')
    INSERT INTO enfant (ID, PARENT_ID, NFM_LIB) VALUES (4, 1, 'Fusée')
    INSERT INTO enfant (ID, PARENT_ID, NFM_LIB) VALUES (5, 1, 'ULM')
    INSERT INTO enfant (ID, PARENT_ID, NFM_LIB) VALUES (6, 2, 'Militaire')
    INSERT INTO enfant (ID, PARENT_ID, NFM_LIB) VALUES (7, 2, 'Tourisme')
    INSERT INTO enfant (ID, PARENT_ID, NFM_LIB) VALUES (8, 2, 'Civil')
    INSERT INTO enfant (ID, PARENT_ID, NFM_LIB) VALUES (9, 3, 'Vélo')
    INSERT INTO enfant (ID, PARENT_ID, NFM_LIB) VALUES (10, 3, 'Voiture')
    INSERT INTO enfant (ID, PARENT_ID, NFM_LIB) VALUES (11, 3, 'Camion')
    INSERT INTO enfant (ID, PARENT_ID, NFM_LIB) VALUES (12, 4, 'Side-car')
    INSERT INTO enfant (ID, PARENT_ID, NFM_LIB) VALUES (13, 4, 'Trail')
    INSERT INTO enfant (ID, PARENT_ID, NFM_LIB) VALUES (14, 5, 'Planche à voile')
    INSERT INTO enfant (ID, PARENT_ID, NFM_LIB) VALUES (15, 5, 'Paquebot')
    INSERT INTO enfant (ID, PARENT_ID, NFM_LIB) VALUES (16, 5, 'Voilier')
    - Pas d'élément englobant racine, mais je suppose que ce n'est pas grave.
    - Les feuilles sont dans une autre table et n'ont pas de borne.
    - Les feuilles sont liées aux branche par un PARENT_ID.
    - Les branches sont très rarement mises à jour contrairement au feuilles, d'où cette solution bâtarde.

    Maintenant, mon souci est d'obtenir les feuilles d'une même branche depuis une de ces feuilles. Par exemple, comment obtenir tous les véhicules aériens depuis "Militaire"? J'ai naïvement tenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select e.*
    from ENFANT e
      inner join PARENT p1 on e.PARENT_ID = p1.PARENT_ID
      inner join PARENT p2 on p1.NFM_BG < p2.NFM_BG and p1.NFM_BD > p2.NFM_BD
    where e.ID = 6
    qui ne me retourne rien.

    Voyez-vous où je veux en venir? Et voyez-vous une réponse au problème?
    L'étape finale étant de trouver la feuille précédente ou suivante par leur colonne ID d'une branche, feuilles qui seraient "ULM" et "Tourisme" dans l'exemple cité (dans ce cas le terme "branche" est-il correct?).

    Merci par avance.

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Maintenant, mon souci est d'obtenir les feuilles d'une même branche depuis une de ces feuilles. Par exemple, comment obtenir tous les véhicules aériens depuis "Militaire"? J'ai naïvement tenté :
    Ton alias "e" référence la table qui donne la feuille de départ.
    Si tu veux ses frères, il te faut joindre avec une autre occurence de la table enfant, non ?

    En gros, "ENFANT e1 JOIN PARENT p" pour choper le père.
    ENFANT e1 JOIN PARENT p JOIN ENFANT e2 pour avoir tous les enfants du père. C'est ça ?

  3. #3
    Membre émérite Avatar de franculo_caoulene
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 880
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 880
    Points : 2 953
    Points
    2 953
    Par défaut
    Merci beaucoup pour ton aide. En effet, j'étais focalisé sur le parent et oubliais de faire une jointure sur les enfants.

    Les feuilles d'une même branche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT e2 . *
    FROM ENFANT e1
      INNER JOIN PARENT p1 ON e1.PARENT_ID = p1.PARENT_ID
      INNER JOIN ENFANT e2 ON p1.PARENT_ID = e2.PARENT_ID AND e2.ID <> 6
    WHERE e1.ID = 6
    La branche (ou sous-arbre je ne sais pas) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT p2 . *
    FROM ENFANT e1
      INNER JOIN PARENT p1 ON e1.PARENT_ID = p1.PARENT_ID
      INNER JOIN PARENT p2 ON p1.NFM_BG >= p2.NFM_BG AND p1.NFM_BD <= p2.NFM_BD
    WHERE e1.ID = 6
    Les feuilles d'autres branches du même arbre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT e2 . *
    FROM ENFANT e1
      INNER JOIN PARENT p1 ON e1.PARENT_ID = p1.PARENT_ID
      INNER JOIN PARENT p2 ON p1.NFM_BG >= p2.NFM_BG AND p1.NFM_BD <= p2.NFM_BD
      INNER JOIN ENFANT e2 ON p2.PARENT_ID = e2.PARENT_ID AND e2.ID <> 6
    WHERE e1.ID = 6

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

Discussions similaires

  1. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  2. [Toutes versions] coller les données d'une plage d'une cellule dans une cellule d'une autre feuille[VBA]
    Par arthson dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 24/01/2012, 17h37
  3. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  4. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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