По работе родилась небольшая подзадачка.
Имеется простенькая таблица, реализующая древовидные данные:
Код: Выделить всё
Create Table Relations (
Master_id Integer not null,
Detail_id Integer not null,
Master_Detail_rate number not null
)
Задача. Имея некий исходный ID (pStart_ID), требуется получить "линейный" список всех "узлов поддерева с вершиной в pStart_ID" с коэффициентом, равным произведению всех Master_Detail_rate, для всей цепочки связей, "протянувшихся" от "вершины" pStart_ID до данного (текущего) узла.
Если бы не было этого коэффициента (и не нужно было бы его получать), то список получался бы легко через connect by prior:
Код: Выделить всё
select pStart_ID as ID from dual
union all
select
R.Detail_ID as ID
from
Relations R
CONNECT BY PRIOR R.Detail_ID = R.Master_ID
start with
(R.Master_ID = pStart_ID)
Код: Выделить всё
select pStart_ID as ID, 1 as TOTAL_RATE from dual
union all
select
R.Detail_ID as ID,
-- вместо ????????????? хочется получить
-- произведение полей R.Master_Detail_rate
-- для всей цепочки связей, "протянувшихся"
-- начиная от ROOT до текущего "узла"
????????????? as TOTAL_RATE
from
Relations R
CONNECT BY PRIOR R.Detail_ID = R.Master_ID
start with
(R.Master_ID = pStart_ID)