Re: Database planning - Hierarchical problem - Help needed

From: Jan <janik_at_pobox.sk>
Date: 1 Dec 2004 05:45:47 -0800
Message-ID: <81511301.0412010545.1ae4ba6b_at_posting.google.com>


this example works on Oracle 10g (should work also on Oracle 9i):

  • Creating some demo tables:

CREATE TABLE PERSONS (
    ID NUMBER,
    NAME VARCHAR2(20),
  PRIMARY KEY (ID)); CREATE TABLE RELATIONS (
    PARENT_ID NUMBER,
    CHILD_ID NUMBER);

  • Creating some demo data as in your example:
INSERT INTO PERSONS (ID,NAME) VALUES (1,'Chuck'); 
INSERT INTO PERSONS (ID,NAME) VALUES (2,'John'); 
INSERT INTO PERSONS (ID,NAME) VALUES (3,'Albert'); 
INSERT INTO PERSONS (ID,NAME) VALUES (4,'Bert'); 
INSERT INTO PERSONS (ID,NAME) VALUES (5,'Donna'); 
INSERT INTO PERSONS (ID,NAME) VALUES (6,'Eddie'); 
INSERT INTO PERSONS (ID,NAME) VALUES (7,'Fred'); 
INSERT INTO PERSONS (ID,NAME) VALUES (8,'Gilbert'); 
INSERT INTO RELATIONS (PARENT_ID,CHILD_ID) VALUES (1,2); 
INSERT INTO RELATIONS (PARENT_ID,CHILD_ID) VALUES (1,3); 
INSERT INTO RELATIONS (PARENT_ID,CHILD_ID) VALUES (1,5); 
INSERT INTO RELATIONS (PARENT_ID,CHILD_ID) VALUES (1,6); 
INSERT INTO RELATIONS (PARENT_ID,CHILD_ID) VALUES (1,7); 
INSERT INTO RELATIONS (PARENT_ID,CHILD_ID) VALUES (3,4); 
INSERT INTO RELATIONS (PARENT_ID,CHILD_ID) VALUES (6,8); INSERT INTO RELATIONS (PARENT_ID,CHILD_ID) VALUES (7,8); COMMIT;
  • And then this SELECT will return the following result:

SELECT SYS_CONNECT_BY_PATH(pp.name, '/')||'/'

       ||(SELECT pc.name FROM PERSONS pc WHERE pc.id=r.child_id)   FROM RELATIONS r,

       PERSONS pp	  
	 WHERE pp.id=r.parent_id	   

    CONNECT BY PRIOR child_id = parent_id;
/Chuck/John
/Chuck/Albert
/Chuck/Albert/Bert
/Chuck/Donna
/Chuck/Eddie
/Chuck/Eddie/Gilbert
/Chuck/Fred
/Chuck/Fred/Gilbert
/Albert/Bert
/Eddie/Gilbert
/Fred/Gilbert
-----------------

Regards, Jan

philippe.lecomte_at_step.fr (Philippe) wrote in message news:<ee069cd0.0411290350.474746ae_at_posting.google.com>...
> Hi,
>
> I'm actually on a problem i don't manage to resolve.
> I want to implement a thing like this in a table :
>
> Albert John
> / \ /
> / \ /
> Bert Chuck
> / | \
> / | \
> / | \
> / | \
> Donna Eddie Fred
> \ /
> \ /
> \ /
> Gilbert
>
>
>
> All these links are work relationship between employees...
> So for example, Bert superior is Albert.
> And Chuck has two superiors : Albert and John
>
> What's in ur point the best method to organize this in a table and do
> simple queries on it ?
>
> I tried a modified preorder tree traversal algorithm but since it's
> not hierarchical anymore, i don't manage to get it to work... (some
> item have two superiors)
>
> Any help welcome... (here or by direct email contact)
> philippe.lecomte_at_step.fr
>
> Thnks in advance,
> Philippe
Received on Wed Dec 01 2004 - 14:45:47 CET

Original text of this message