Sql Oracle仅通过返回顶级连接

Sql Oracle仅通过返回顶级连接,sql,oracle,Sql,Oracle,我正在尝试使用“连接方式”获取记录的最顶端父项 Select distinct parent_box_id,box_id, LEVEL, SYS_CONNECT_BY_PATH(box_id, '>') "lineage" FROM box_lineage lineage where lineage.position = 1 START WITH box_id='00112233 ' CONNECT BY box_id = PRIOR pa

我正在尝试使用“连接方式”获取记录的最顶端父项

Select distinct parent_box_id,box_id, 
LEVEL,
SYS_CONNECT_BY_PATH(box_id, '>') "lineage"

  FROM box_lineage lineage 
  where lineage.position = 1 
        START WITH   box_id='00112233   '
   CONNECT BY   box_id = PRIOR parent_box_id
      ORDER SIBLINGS BY box_id;
结果

    parent child level hierarchy
    123456  789456  3   >00112233>963258>789456
    789456  963258  2   >00112233>963258
    963258  00112233    1   >00112233
我想要的只是
1234567894563>00112233>963258>789456

我不知道最高级别是什么可能是2,3,4,5,6

我尝试了
和level>=3
level 1
,但我只得到了最底层

我已经阅读了这里的其他答案,但没有一个有效

尝试使用level

Select distinct parent_box_id,box_id, 
LEVEL,
SYS_CONNECT_BY_PATH(box_id, '>') "lineage"

  FROM box_lineage lineage 
  where lineage.position = 1 
  and level = 3
  CONNECT BY   box_id = PRIOR parent_box_id
  START WITH   box_id ='00112233   '
  ORDER SIBLINGS BY box_id;
…给max试试这个

  Select distinct parent_box_id,box_id, 
  LEVEL,
  SYS_CONNECT_BY_PATH(box_id, '>') "lineage"

  FROM box_lineage lineage 
  where lineage.position = 1 
  and level =  (   

      Select max( LEVEL) 
      FROM box_lineage lineage 
      where lineage.position = 1
      CONNECT BY   box_id = PRIOR parent_box_id
      START WITH   box_id ='00112233   '

  )
  CONNECT BY   box_id = PRIOR parent_box_id
  START WITH   box_id ='00112233   '
  ORDER SIBLINGS BY box_id;

添加
并将\u BY_ISLEAF=1
连接到where子句。

为了说明John Ashley的正确答案,这里有一个针对HR模式中EMPLOYEES表的类似查询(几乎在所有Oracle安装中都存在)

注意-所有的功劳都应该归于约翰·阿什利,这里我只是说明他的解决方案

select employee_id, manager_id, level, sys_connect_by_path(employee_id, '?') as path
from employees
where connect_by_isleaf = 1
start with employee_id = 116
connect by prior manager_id = employee_id
;

EMPLOYEE_ID MANAGER_ID      LEVEL PATH
----------- ---------- ---------- ---------------
        100                     3 ?116?114?100

(注意:在人力资源部的EMPLOYEES表中,“top”为空,公司首席执行官的经理ID-这就是为什么“parent”列显示为空。)

如果我正确理解了这个问题,下面是我所做的:

使用common employees示例可以做到这一点:

SELECT *
FROM
  ( SELECT DISTINCT lowest_employee_id as employee_id,
    manager_id,
    l AS path_level,
    path,
    rank() over (partition BY lowest_employee_id order by l DESC) rnk
  FROM
    (
SELECT employee_id ,
      manager_id,
      level l,
      -- the following line is just for visualization purpose
      SYS_CONNECT_BY_PATH(manager_id, ' > ') path,
      connect_by_root(employee_id ) lowest_employee_id
    from employees
    start with employee_id = 116
    connect by prior manager_id = employee_id
    )
  )
WHERE rnk = 1
说明:


connect\u by\u root
将存储每个级别的起始根,然后我们根据级别编号对级别进行排序,然后我们只筛选不返回任何内容的最新的。和是以开始的吗?如果我将其移动到where子句,我会得到结果集中963258 00112233 1>00112233上方的最后一行,我会稍微更新查询。。最后试着选择level(删除和level=1)来检查什么是合适的level(我原以为是1)level=3工作,有没有办法获得最高级别?可能是4、5或6个etcI更新了答案。。希望是有用的。让我知道,如果在子查询选择后删除逗号,这是有效的。我想知道是否有更好的方法不用子查询和使用GROUPBY…几个问题。。。为什么选择distinct,您希望复制相同的路径吗?那么,如果您只想返回一行,并带有从box\u id到顶部的路径,那么为什么需要ORDER SIBLIENDS BY子句呢?最后,在查询中使用列别名“沿袭”,但在所需的结果中显示“层次结构”,并使用父项框id(在结果中仅显示“父项”)显示相同的结果。