Oracle树层次结构反向遍历父级

时间:2016-08-12 16:25:19

标签: sql oracle11g tree

我有一个来自Oracle树层次结构的以下示例数据(见下文),特别是使用default

假设我使用典型的oracle树查询,即:

SYS_CONNECT_BY_PATH(link_id, '/') as Path

数据样本是:

SELECT link_id, SYS_CONNECT_BY_PATH(link_id, '/') "Path"
FROM my_table
START WITH parent_link_id = 'L1'
CONNECT BY PRIOR link_id = parent_link_id;

现在,我不确定该怎么办,使用路径示例数据,我需要一种从底部向上反向遍历我的路径数据的方法,以确定并返回该链接id的第一个“Q”起始字符串,这是该链接ID的父级。

例如:

L1   /LINK-A/QWERTY/QEDED1SA/AAAA|BBBB|CCCC/XX|YY|ZZ/L1

L2   /LINK-B/QETRYAB/QWERTY/L2

我实际上希望将此父“Q”字符串值作为我的树查询路径的一部分检索为“Path”之后的另一列

基本上将该链接的树路径分支,直到您点击以字母“Q”开头的父级并单独返回整个值。

1 个答案:

答案 0 :(得分:1)

您可以将此表达式用于其他列:

regexp_substr(SYS_CONNECT_BY_PATH(link_id, '/'), '/(Q[^/]*)(/[^Q]|[^/])*$', 1, 1, '', 1)

它在SYS_CONNECT_BY_PATH(link_id, '/')中找到以Q开头的最后一个零件。

参数1, 1, ''只是这些参数的默认值,但它们是提供的,以便可以指定最后一个参数。该论点表示不返回整个匹配,而只返回第一个捕获组,即Q[^/]*匹配的任何内容。正则表达式中的所有其余部分用于确保没有其他此类部分跟随它。