Sql oracle 9i通过给定子级获得树的最高成员
我在Oracle 9i数据库表中具有父子关系 比如: 我需要从一个孩子那里得到绝对父母。 说,我有孩子4,它必须给我父母:1 我已经在寻找连接方式,但找不到解决方案Sql oracle 9i通过给定子级获得树的最高成员,sql,oracle,plsql,oracle9i,connect-by,Sql,Oracle,Plsql,Oracle9i,Connect By,我在Oracle 9i数据库表中具有父子关系 比如: 我需要从一个孩子那里得到绝对父母。 说,我有孩子4,它必须给我父母:1 我已经在寻找连接方式,但找不到解决方案 SELECT parent FROM ( SELECT parent FROM ( SELECT parent, level AS l FROM mytable START WITH
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
,请将父项
替换为子项
:
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
您可以使用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
那么你想要的是最终的父母,而不是他们之间的所有联系?是的,没错。我现在不知道运行时有多少个级别。我需要绝对父级,没有预定义的级别数。此查询提供绝对父级(
NULL
)。如果您想要1
,只需在上面的查询中将父项
替换为子项
。
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