0

I have a data like this:

+----+-----------+
| ID | PARENT_ID |
+----+-----------+
| a  | b         |
| b  | c         |
| c  | d         |
| d  | e         |
| e  | f         |
| f  | x         |
| x  | null      |
+----+-----------+

where I need to extract all descendants from 'x', not just direct children, but any records that originated from 'x' such as 'a' to 'e'. I am using this query but it is getting ridiculous!

SELECT *
  FROM (SELECT l1.ID AS ancestor, l2.ID AS descendant
          FROM POST l1 JOIN POST l2 ON l1.parent_id = l2.ID
        UNION
        SELECT l1.ID, l3.ID
          FROM POST l1 JOIN POST l2 ON l1.parent_id = l2.ID
               JOIN POST l3 ON l2.parent_id = l3.ID
        UNION
        SELECT l1.ID, l4.ID
          FROM POST l1 JOIN POST l2 ON l1.parent_id = l2.ID
               JOIN POST l3 ON l2.parent_id = l3.ID
               JOIN POST l4 ON l3.parent_id = l4.ID
        UNION
        .....
        UNION
        SELECT l1.ID, l7.ID
          FROM POST l1 JOIN POST l2 ON l1.parent_id = l2.ID
               JOIN POST l3 ON l2.parent_id = l3.ID
               JOIN POST l4 ON l3.parent_id = l4.ID
               JOIN POST l5 ON l4.parent_id = l5.ID
               JOIN POST l6 ON l5.parent_id = l6.ID
               JOIN POST l7 ON l6.parent_id = l7.ID
               ) sub
 WHERE sub.ancestor = 'x';

Any code here that can support descendants greater than 7 levels deep? I am in needing it badly. This is exactly this dba question here except that I need it on Oracle DB so I decide to ask a new question.

Gideon
  • 1,469
  • 2
  • 26
  • 57
  • 1
    https://docs.oracle.com/cd/B28359_01/server.111/b28286/queries003.htm#SQLRF52315 use `CONNECT BY` and `START WITH` – StanislavL May 02 '17 at 06:02

1 Answers1

1

Use this. Referred this article

SELECT
   id
FROM
   post
CONNECT BY
   PRIOR id = parent_id
START WITH
   id = 'x';
Utsav
  • 7,914
  • 2
  • 17
  • 38