I have categories table where parent_id is self referencing foreign key.
categories table :
select * from categories;
| category_id | name | parent_id |
|---|---|---|
| 1 | T1 | null |
| 2 | T2 | null |
| 3 | T11 | 1 |
| 4 | T12 | 1 |
| 5 | T111 | 3 |
| 6 | T112 | 3 |
| 7 | T1121 | 6 |
| 8 | T1122 | 6 |
| 9 | T121 | 4 |
| 10 | T122 | 4 |
| 11 | T21 | 2 |
| 12 | T211 | 11 |
| 13 | T212 | 11 |
| 14 | T2111 | 12 |
Expected Output -
select * , 'some path sql' as path from categories;
| category_id | name | parent_id | path |
|---|---|---|---|
| 1 | T1 | null | T1 |
| 2 | T2 | null | T2 |
| 3 | T11 | 1 | T1 -> T11 |
| 4 | T12 | 1 | T1 -> T12 |
| 5 | T111 | 3 | T1 -> T11 -> T111 |
| 6 | T112 | 3 | T1 -> T11 -> T112 |
| 7 | T1121 | 6 | T1 -> T11 -> T112 -> T1121 |
| 8 | T1122 | 6 | T1 -> T11 -> T112 -> T1122 |
| 9 | T121 | 4 | T1 -> T12 -> T121 |
| 10 | T122 | 4 | T1 -> T12 -> T122 |
| 11 | T21 | 2 | T2 -> T21 |
| 12 | T211 | 11 | T1 -> T21 -> T211 |
| 13 | T212 | 11 | T1 -> T21 -> T212 |
| 14 | T2111 | 12 | T1 -> T21 -> T211 -> T2111 |
What i have tried :
I have tried this query but its return 38 rows. I want actual 14 rows.
WITH RECURSIVE cte_name AS (
select category_id, name, parent_id , name AS path from categories
UNION ALL
select c.category_id,c.name,c.parent_id, concat_ws(' -> ', cte_name.path, c.name)
from categories as c
INNER JOIN cte_name ON cte_name.category_id = c.parent_id
)
SELECT * FROM cte_name;
I have no idea how to write exact query that will return actual all 14 rows with its path.