暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle SYS_CONNECT_BY_PATH将路径简化为2个特定级别

askTom 2018-02-22
512

问题描述

嗨,

在浏览了很多以前的示例之后,我想从许多月亮之前使用的示例中背出来,并要求更改显示的结果。

https://asktom.oracle.com/pls/asktom/f%3Fp%3D100:11:0::::P11_QUESTION_ID:907278700346567560



ops $ tkyte % ORA11GR1> 选择substr( scbp,instr(scbp,'-',1,1)+ 1,instr(scbp,'-',1,2)-instr(scbp,'-',1,1)-1) l1,
2 substr( scbp,instr(scbp,'-',1,2) 1,instr(scbp,'-',1,3)-instr(scbp,'-',1,2)-1) l2,
3 substr( scbp,instr(scbp,'-',1,3) 1,instr(scbp,'-',1,4)-instr(scbp,'-',1,3)-1) l3,
4 substr( scbp,instr(scbp,'-',1,4) 1,instr(scbp,'-',1,5)-instr(scbp,'-',1,4)-1) l4,
5 substr( scbp,instr(scbp,'-',1,5) 1,instr(scbp,'-',1,6)-instr(scbp,'-',1,5)-1) l5,
6 substr( scbp,instr(scbp,'-',1,6) 1,instr(scbp,'-',1,7)-instr(scbp,'-',1,6)-1) l6
7来自 (
8选择系统连接路径 (儿童节点,'-') | | '-' scbp
9来自分支机构
10从PARENT_NODE = ''开始
11通过先验CHILD_NODE = PARENT_NODE连接
12)
13/

L1 L2 L3 L4 L5 L6
-
级别1
级别1 LEVEL2
级别1 LEVEL2 LEVEL3.1
级别1 LEVEL2 LEVEL3.1 LEVEL4.1
级别1 LEVEL2 LEVEL3.1 LEVEL4.1 LEVEL5.1
级别1 LEVEL2 LEVEL3.1 LEVEL4.1 LEVEL5.2
级别1 LEVEL2 LEVEL3.1 LEVEL4.1 LEVEL5.2 LEVEL6.1
级别1 LEVEL2 LEVEL3.1 LEVEL4.1 LEVEL5.2 LEVEL6.2
级别1 LEVEL2 LEVEL3.1 LEVEL4.2
级别1 LEVEL2 LEVEL3.1 LEVEL4.2 LEVEL5.3
级别1 LEVEL2 LEVEL3.1 LEVEL4.2 LEVEL5.3 LEVEL6.3
级别1 LEVEL2 LEVEL3.1 LEVEL4.2 LEVEL5.3 LEVEL6.4
级别1 LEVEL2 LEVEL3.1 LEVEL4.2 LEVEL5.4
级别1 LEVEL2 LEVEL3.1 LEVEL4.2 LEVEL5.4 LEVEL6.5
级别1 LEVEL2 LEVEL3.2
级别1 LEVEL2 LEVEL3.3
级别1 LEVEL2 LEVEL3.3 LEVEL4.3
级别1 LEVEL2 LEVEL3.3 LEVEL4.3 LEVEL5.5
级别1 LEVEL2 LEVEL3.3 LEVEL4.3 LEVEL5.6
级别1 LEVEL2 LEVEL3.3 LEVEL4.4
级别1 LEVEL2 LEVEL3.3 LEVEL4.4 LEVEL5.7
级别1 LEVEL2 LEVEL3.3 LEVEL4.4 LEVEL5.8


如何仅返回级别1和级别2的值来创建缩短的层次结构路径?每个字段中的条目可以是不同的长度,因此字符限制并不理想。

Path result would be great if it could look like >级别1>LEVEL2

感谢您的任何帮助。

专家解答

我不太确定您在追求什么-因此,这是一个演示,以获取领先和落后的两个项目

SQL> @drop t

Y1                                                                                           Y2
-------------------------------------------------------------------------------------------- -------------------------
TABLE                                                                                        cascade constraints purge

1 row selected.


Table dropped.

SQL>
SQL> create table t ( id int, par_id int );

Table created.

SQL>
SQL> insert into t
  2  select rownum, decode(rownum,1,null,rownum-1)
  3  from dual
  4  connect by level <= 10;

10 rows created.

SQL>
SQL> select lpad(id,level*2) id,  par_id, sys_connect_by_path(id,'~') tree
  2  from t
  3  start with par_id is null
  4  connect by prior id = par_id;

ID                                 PAR_ID TREE
------------------------------ ---------- ------------------------------
 1                                        ~1
   2                                    1 ~1~2
     3                                  2 ~1~2~3
       4                                3 ~1~2~3~4
         5                              4 ~1~2~3~4~5
           6                            5 ~1~2~3~4~5~6
             7                          6 ~1~2~3~4~5~6~7
               8                        7 ~1~2~3~4~5~6~7~8
                 9                      8 ~1~2~3~4~5~6~7~8~9
                  10                    9 ~1~2~3~4~5~6~7~8~9~10

10 rows selected.

SQL>
SQL> with raw_data as
  2  (
  3  select lpad(id,level*2) id,  par_id, sys_connect_by_path(id,'~') tree
  4  from t
  5  start with par_id is null
  6  connect by prior id = par_id
  7  )
  8  select raw_data.*,
  9         case when instr(tree,'~',1,3) > 0 then
 10           substr(tree,1,instr(tree,'~',1,3))
 11         else
 12           tree
 13         end first_two,
 14         case when regexp_count(tree,'~') > 1 then
 15            substr(tree,instr(tree,'~',1,regexp_count(tree,'~')-1))
 16         else
 17            tree
 18         end last_two
 19  from raw_data;

ID                                 PAR_ID TREE                           FIRST_TWO            LAST_TWO
------------------------------ ---------- ------------------------------ -------------------- --------------------
 1                                        ~1                             ~1                   ~1
   2                                    1 ~1~2                           ~1~2                 ~1~2
     3                                  2 ~1~2~3                         ~1~2~                ~2~3
       4                                3 ~1~2~3~4                       ~1~2~                ~3~4
         5                              4 ~1~2~3~4~5                     ~1~2~                ~4~5
           6                            5 ~1~2~3~4~5~6                   ~1~2~                ~5~6
             7                          6 ~1~2~3~4~5~6~7                 ~1~2~                ~6~7
               8                        7 ~1~2~3~4~5~6~7~8               ~1~2~                ~7~8
                 9                      8 ~1~2~3~4~5~6~7~8~9             ~1~2~                ~8~9
                  10                    9 ~1~2~3~4~5~6~7~8~9~10          ~1~2~                ~9~10

10 rows selected.

SQL>
复制


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论