鉴于下表
KID | CROSS_LINK | KEY | GROUP_KEY
--------|------------|--------|-----------
COR001 | | 711768 | 336406
EXP001 | | 740194 | 336406
POD002 | DPR002 | 712408 | 336406
POD003 | POD002 | 718445 | 336406
DPR001 | | 711825 | 336406
TRC001 | | 713773 | 336406
DPR002 | | 712199 | 336406
POD001 | DPR001 | 712191 | 336406
POD004 | POD001 | 815174 | 336406
POD005 | POD003 | 815181 | 336406
POD002 | DPR001 | 478800 | 475873
POD005 | POD002 | 300266 | 475873
DPR001 | | 300202 | 475873
我的sql语句是
select level lvl, kid, CONNECT_BY_ROOT CROSS_LINK as father, key, group_key
from t
start with CROSS_LINK is not null
CONNECT BY PRIOR kid = CROSS_LINK
order by GROUP_KEY
您可以将CROSS_LINK视为父列。 我的目的是显示GROUP_KEY中KID的所有父亲(层次结构中的直接父亲和间接父亲)。
此查询不会以隔离的方式在GROUP_KEY中运行。您可以观察到KID'POD005'的行为问题。在下图中,我突出显示了错误的行。
答案 0 :(得分:0)
在您的CONNECT BY
子句中添加条件以强制其仅查找与父行相同的GROUP_KEY
中的子项。
select level lvl, kid, CONNECT_BY_ROOT CROSS_LINK as father, key, group_key
from t
start with CROSS_LINK is not null
CONNECT BY PRIOR kid = CROSS_LINK
AND PRIOR group_key = group_key
order by GROUP_KEY