Когда кодер не знает, что Вы считаете строки кода, и также - никакая причина сознательно добавить избыточный код для игр системы. И когда у всех в команде есть подобный стиль кодирования (таким образом, существует известное среднее "значение" на строку.) И только если Вы не имеете лучшую меру в наличии.
вы можете использовать запрос CONNECT BY для создания списка родителей, а затем отфильтровать:
SQL> WITH tree AS (
2 SELECT 1 parent_id, 2 child_id FROM DUAL
3 UNION ALL SELECT 2 , 3 FROM DUAL
4 UNION ALL SELECT 2 , 4 FROM DUAL
5 UNION ALL SELECT null, 1 FROM DUAL
6 UNION ALL SELECT 1 , 8 FROM DUAL
7 )
8 SELECT child_id
9 FROM (SELECT *
10 FROM tree
11 CONNECT BY PRIOR parent_id = child_id
12 START WITH child_id = 4)
13 WHERE parent_id IS NULL;
CHILD_ID
----------
1
SELECT parent
FROM (
SELECT parent
FROM (
SELECT parent, level AS l
FROM mytable
START WITH
child = 4
CONNECT BY
child = PRIOR parent
)
ORDER BY
l DESC
)
WHERE rownum = 1
Это даст вам NULL
в качестве абсолютного родителя.
Если вы хотите 1
, замените родительский
на child
:
SELECT child
FROM (
SELECT child
FROM (
SELECT child, level AS l
FROM mytable
START WITH
child = 4
CONNECT BY
child = PRIOR parent
)
ORDER BY
l DESC
)
WHERE rownum = 1