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

 PostgreSQL Discussion :

table récursivement jointe à elle-même


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Points : 48
    Points
    48
    Par défaut table récursivement jointe à elle-même
    Bonjour,

    j'ai un petit problème à vous soumettre. Soit un ensemble E d'objet représentés de façon biunivoque par des entiers, tels que chaque objet a un parent au plus ; les parents font eux-mêmes partie de E. On représente dans une table nommée 'Objets' à deux colonnes (id | parent_id) les liens de filiation entre les objets. L'objet numéroté id a comme objet parent celui représenté par parent_id. Ma question : comment récupérer, pour chaque objet, la suite d'entiers représentant ses 'aïeux' ?

    J'ai une solution 'finie', en se disant, par exemple, qu'un objet n'a au plus que 2 aïeux :

    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
     
    -- réplique de la table Objets
    CREATE TEMPORARY VIEW objets1 AS
    	SELECT id AS parent1, parent_id AS parent_parent1
    		FROM Objets;
     
    -- réplique de la table Objets
    CREATE TEMPORARY VIEW objets2 AS
    	SELECT id AS parent1, parent_id AS parent_parent2
    		FROM Objets;
     
    SELECT id, parent1, parent2
    	FROM 
    	Objets,
    	objets1,
    	objets2
            WHERE 
            Objets.parent_id = objets1.parent1 AND
            objets1.parent_parent1 = objets2.parent2;
    Mais je me demande s'il y a plus malin et plus 'générique'... Quelqu'un aurait une idée ? Y a-t-il des fonctions "search" ou "find" qu'on puisse utiliser ? Je ne sais pas trop comment mieux prendre le problème, ne maîtrisant pas bien PostgreSQL...

    Merci pour votre aide !

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 683
    Points : 2 579
    Points
    2 579
    Par défaut
    Bonjour,

    vous avez besoin de récursivité ce qui ne peut se faire sans CTE (http://sqlpro.developpez.com/cours/s...te-recursives/). Postgre implémente apparemment les CTE, je vous laisse le soin de digérer la doc :

    http://www.postgresql.org/docs/8.4/s...ries-with.html

  3. #3
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Points : 48
    Points
    48
    Par défaut
    Merci pour votre réponse ! Je me mets de suite à la lecture...

  4. #4
    Membre averti
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Points : 304
    Points
    304
    Par défaut
    A voir si ça fonctionne avec une vue, mais je ne promets rien et je n'ai pas les moyens de tester.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE VIEW V_Objects_Parents (id, parent_id, level) AS
    (
    (SELECT o.id, o.parent_id, '1' FROM Objets o)
    UNION
    (SELECT o.id, v.parent_id, v.level + 1
    FROM Objets o
    JOIN V_Objets_Parents v ON v.id = o.parent_id)
    )

  5. #5
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 52
    Points : 48
    Points
    48
    Par défaut
    Merci ! Votre code ne fonctionne pas avec une vue, le voilà déguisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    WITH RECURSIVE V_Objects_Parents (id, parent_id, level, chem) AS
    (
    (SELECT o.id, o.parent_id, 1, o.name FROM Objets o)
    UNION
    (SELECT o.id, v.parent_id, v.level + 1, v.chem || '/' || o.name
    FROM Objets o
    JOIN V_Objects_Parents v ON v.id = o.parent_id)
    )
    SELECT * FROM V_Objects_Parents
    Merci à tous les deux ! NB : la doc postgre est sybilline, mais le cours sur les CTE récursives est super didactique

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

Discussions similaires

  1. Table liée avec elle même
    Par jozzz dans le forum Access
    Réponses: 1
    Dernier message: 12/06/2006, 11h53
  2. Pb table liée sur elle même
    Par mastasushi dans le forum Access
    Réponses: 12
    Dernier message: 17/05/2006, 10h43
  3. Croisement d'une table avec elle même
    Par lelapin dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/09/2005, 07h44
  4. TABLE pointant sur elle-même, requete de selection recursive
    Par Mike@Nestor dans le forum Langage SQL
    Réponses: 1
    Dernier message: 27/07/2005, 14h50
  5. [arborescence] jointure d'une table avec elle même ?
    Par Celelibi dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/11/2004, 18h48

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