Вы можете использовать следующий запрос:
WITH HIER_CTE AS (
-- Anchor member: get root nodes
SELECT ref_id, parent_id, 1 AS lvl,
-- Use ROW_NUMBER() to assign a unique ID to each root node
ROW_NUMBER() OVER (ORDER BY ref_id) AS rn
FROM mytable
WHERE ref_id = parent_id
UNION ALL
-- Recursive member: get node of next level
SELECT t.ref_id, t.parent_id, h.lvl + 1 AS lvl, rn
FROM mytable AS t
INNER JOIN HIER_CTE AS h ON h.ref_id = t.parent_id
WHERE t.ref_id <> t.parent_id
)
SELECT ref_id
FROM HIER_CTE
ORDER BY rn, lvl DESC
Выход:
ref_id
------
A
B
C
D
P
Q
R
X
Y