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(在结果中仅显示“父项”)显示相同的结果。