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.