Thanks a bunch.Excellent and elegant solution,Worked perfectly with a single FTS, performed very well.
But the requirement changed again not to duplicate the pair and to link with parent instead of generating a surrogate key for each key pairs.
CREATE TABLE PLAN
(
PLAN_ID NUMBER(10),
PLAN_KEY VARCHAR2(25),
PLAN_VAL NUMBER(1) CHECK(plan_val < 6),
PARENT_ID NUMBER(10)
)
INSERT INTO PLAN
SELECT 100,'A1',1,NULL FROM DUAL
UNION ALL
SELECT 101,'B1',2,100 FROM DUAL
UNION ALL
SELECT 102,'B2',2,100 FROM DUAL
UNION ALL
SELECT 103,'C1',3,101 FROM DUAL
UNION ALL
SELECT 104,'D1',4,103 FROM DUAL
UNION ALL
SELECT 113,'C2',3,102 FROM DUAL
UNION ALL
SELECT 105,'E1',5,104 FROM DUAL
UNION ALL
SELECT 106,'E2',5,104 FROM DUAL
UNION ALL
SELECT 123,'D2',4,113 FROM DUAL
UNION ALL
SELECT 124,'D3',4,113 FROM DUAL
UNION ALL
SELECT 133,'E5',5,123 FROM DUAL
UNION ALL
SELECT 134,'E6',5,123 FROM DUAL
UNION ALL
SELECT 135,'E7',5,123 FROM DUAL
UNION ALL
SELECT 144,'E8',5,124 FROM DUAL
UNION ALL
SELECT 146,'E9',5,124 FROM DUAL
Luckily, outer join query worked just by changing where clause to join with parent_id.
Query with Outer joins:
SELECT p5.plan_id,p5.plan_key,p5.plan_val,
case p5.plan_val when 5 then p1.plan_key when 4 then p2.plan_key when 3 then p3.plan_key when 2 then p4.plan_key when 1 then p5.plan_key end kp1_key,
case p5.plan_val when 5 then p1.plan_val when 4 then p2.plan_val when 3 then p3.plan_val when 2 then p4.plan_val when 1 then p5.plan_val end kp1_val,
case p5.plan_val when 5 then p2.plan_key when 4 then p3.plan_key when 3 then p4.plan_key when 2 then p4.plan_key end kp2_key,
case p5.plan_val when 5 then p2.plan_val when 4 then p3.plan_val when 3 then p4.plan_val when 2 then p4.plan_val end kp2_val,
case p5.plan_val when 5 then p3.plan_key when 4 then p4.plan_key when 3 then p5.plan_key end kp3_key,
case p5.plan_val when 5 then p3.plan_val when 4 then p4.plan_val when 3 then p5.plan_val end kp3_val,
case p5.plan_val when 5 then p4.plan_key when 4 then p5.plan_key end kp4_key,
case p5.plan_val when 5 then p4.plan_val when 4 then p5.plan_val end kp4_val,
case p5.plan_val when 5 then p5.plan_key end kp5_key,
case p5.plan_val when 5 then p5.plan_val end kp5_val
FROM plan p1
right outer join plan p2 on p2.plan_val = p1.parent_id
right outer join plan p3 on p3.plan_val = p2.parent_id
right outer join plan p4 on p4.plan_val = p3.parent_id
right outer join plan p5 on p5.plan_val = p4.parent_id
ORDER BY p5.plan_val
I tried PL/SQL approach in different ways but could not get the desired output like below.
100 A1 1
101 100 A1 1 B1 2
102 100 A1 1 B2 2
103 101 A1 1 B1 2 C1 3
113 102 A1 1 B2 2 C2 3
104 103 A1 1 B1 2 C1 3 D1 4
123 113 A1 1 B2 2 C2 3 D2 4
124 113 A1 1 B2 2 C2 3 D3 4
105 104 A1 1 B1 2 C1 3 D1 4 E1 5
106 104 A1 1 B1 2 C1 3 D1 4 E2 5
133 123 A1 1 B2 2 C2 3 D2 4 E5 5
134 123 A1 1 B2 2 C2 3 D2 4 E6 5
135 123 A1 1 B2 2 C2 3 D2 4 E7 5
144 124 A1 1 B2 2 C2 3 D3 4 E8 5
146 124 A1 1 B2 2 C2 3 D3 4 E9 5