У меня есть дочерняя родительская таблица, подобная этой (0 означает, что это верхний элемент):
itemID | parentItemId
---------------------
1 | 0
2 | 0
3 | 0
4 | 1
5 | 1
6 | 2
7 | 5
8 | 7
9 | 7
Я хочу добавить новый столбец, который будет rootItemId в соответствии с этой логикой:
Если это верхний элемент, то rootItemId = itemID
, иначе rootItemId
будет элементом под корнем (т.е. уровень - 2) itemID.
Это будет выглядеть так:
itemID | parentItemId | rootItemId
----------------------------------
1 | 0 | 1
2 | 0 | 2
3 | 0 | 3
4 | 1 | 4
5 | 1 | 5
6 | 2 | 6
7 | 5 | 5
8 | 7 | 5
9 | 7 | 5
Я могу получить этот результат, используя следующий sql:
select itemID,
parentItemId,
itemID as rootItemId
from ItemTable
where itemID = 0
union
select itemID,
parentItemId,
connect_by_root parentItemId as rootItemId
from ItemTable
start with parentItemId in
(select itemID
from ItemTable
where parentItemId =0)
connect by prior itemID = parentItemId
Есть ли более элегантный и эффективный способдостичь таких же результатов ?
Спасибо