Sql oracle 9i通过给定子级获得树的最高成员

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

我在Oracle 9i数据库表中具有父子关系

比如:

我需要从一个孩子那里得到绝对父母。 说,我有孩子4,它必须给我父母: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
,请将
父项
替换为
子项

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