ORACLE-FUNCTION-SYS_CONNECT_BY_PATH

本文介绍了一个使用 Oracle SQL 的 CONNECT BY 功能来构建层级结构的示例。通过详细的表结构、查询语句及预期结果,展示了如何追踪每个节点的父子关系,并确定节点在层级中的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

表结构:

create table test_connect_by (child number,parent number);

原表数据:

CHILD    PARENT
2    5
3    5
10    15
5    15
9    17
8    17
15    38
17    38
6    38
13    26
1    26
12    26
11    18
7    18
38    
26    
18    
期望结果:

当前节点    当前节点父节点    枝干关系    当前节点所在层    根节点    当前叶子节点    是否叶子节点
38        ->38    1    38        否
17    38    ->38->17    2    38        否
9    17    ->38->17->9    3    38    9    是
8    17    ->38->17->8    3    38    8    是
15    38    ->38->15    2    38        否
10    15    ->38->15->10    3    38    10    是
5    15    ->38->15->5    3    38        否
3    5    ->38->15->5->3    4    38    3    是
2    5    ->38->15->5->2    4    38    2    是
6    38    ->38->6    2    38    6    是
26        ->26    1    26        否
13    26    ->26->13    2    26    13    是
12    26    ->26->12    2    26    12    是
1    26    ->26->1    2    26    1    是
18        ->18    1    18        否
11    18    ->18->11    2    18    11    是
7    18    ->18->7    2    18    7    是

查询语句:

SELECT A.CHILD 当前节点,       
       --A.PARENT 当前节点父节点,       
       PRIOR A.CHILD 当前节点父节点,       
       SYS_CONNECT_BY_PATH(CHILD, '->') 枝干关系,
       LEVEL 当前节点所在层,
       CONNECT_BY_ROOT A.CHILD 根节点,       
       DECODE(CONNECT_BY_ISLEAF, 1, A.CHILD, NULL) 当前叶子节点,       
       DECODE(CONNECT_BY_ISLEAF, 1, '是', '否') 是否叶子节点
  FROM TEST_CONNECT_BY A
 --WHERE (a.child = '15' OR a.parent = '15')
 START WITH A.PARENT IS NULL --从parent为空开始扫描
CONNECT BY PRIOR A.CHILD = A.PARENT --以child为父列连接parent
-- ORDER BY CHILD;
ORDER SIBLINGS BY CHILD DESC --对层次排序
测试数据插入语句:

INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (2, 5);
INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (3, 5);
INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (10, 15);
INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (5, 15);
INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (9, 17);
INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (8, 17);
INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (15, 38);
INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (17, 38);
INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (6, 38);
INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (13, 26);
INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (1, 26);
INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (12, 26);
INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (11, 18);
INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (7, 18);
INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (38, NULL);
INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (26, NULL);
INSERT INTO TEST_CONNECT_BY (CHILD, PARENT) VALUES (18, NULL);
COMMIT;

另可参考:http://hb.qq.com/a/20100412/003378.htm 有较详细说明

资源下载链接为: https://pan.quark.cn/s/f989b9092fc5 今天给大家分享一个关于C#自定义字符串替换方法的实例,希望能对大家有所帮助。具体介绍如下: 之前我遇到了一个算法题,题目要求将一个字符串中的某些片段替换为指定的新字符串片段。例如,对于源字符串“abcdeabcdfbcdefg”,需要将其中的“cde”替换为“12345”,最终得到的结果字符串是“ab12345abcdfb12345fg”,即从“abcdeabcdfbcdefg”变为“ab12345abcdfb12345fg”。 经过分析,我发现不能直接使用C#自带的string.Replace方法来实现这个功能。于是,我决定自定义一个方法来完成这个任务。这个方法的参数包括:原始字符串originalString、需要被替换的字符串片段strToBeReplaced以及用于替换的新字符串片段newString。 在实现过程中,我首先遍历原始字符串,查找需要被替换的字符串片段strToBeReplaced出现的位置。找到后,就将其替换为新字符串片段newString。需要注意的是,在替换过程中,要确保替换操作不会影响后续的查找和替换,避免遗漏或重复替换的情况发生。 以下是实现代码的大概逻辑: 初始化一个空的字符串result,用于存储最终替换后的结果。 使用IndexOf方法在原始字符串中查找strToBeReplaced的位置。 如果找到了,就将originalString中从开头到strToBeReplaced出现位置之前的部分,以及newString拼接到result中,然后将originalString的查找范围更新为strToBeReplaced之后的部分。 如果没有找到,就直接将剩余的originalString拼接到result中。 重复上述步骤,直到originalStr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值