Jslfl【软件开发技术笔记】

oracle递归树查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
tb_org表结构:
| orgid | parentorgid | orgname |
|   1   |     NULL    | 总公司  |
|   2   |     1       | 四川公司|
|   3   |     2       | 成都公司|
|   4   |     1       | 北京公司|

--start with 数据开始条件 connect by prior 树形结构条件

--伪列函数SYS_CONNECT_BY_PATH,CONNECT_BY_ROOT,CONNECT_BY_LEAF,CONNECT_BY_ISCYCLE

--查询层级
SELECT level,orgid,orgname,parentorgid FROM tb_org
START WITH orgid=1 --从orgid=1的数据开始找起走,或用parentid is null
CONNECT BY prior orgid=parentorgid; --树结构条件

| level | orgid | orgname | parentorgid |
|  1    |   1   | 总公司   |     NULL    |
|  2    |   2   | 四川公司 |     1       |
|  3    |   3   | 成都公司 |     2       |
|  2    |   4   | 北京公司 |     1       |

SELECT level,orgid,orgname,parentorgid FROM tb_org
START WITH orgid=1
CONNECT BY prior orgid=parentorgid
ORDER BY level;

| level | orgid | orgname | parentorgid |
|  1    |   1   | 总公司   |     NULL    |
|  2    |   2   | 四川公司 |     1       |
|  2    |   4   | 北京公司 |     1       |
|  3    |   3   | 成都公司 |     2       |

--缩进
SELECT level,
 lpad(' ',3*level-1)||'|--'||orgname AS orgname
FROM tb_org
START WITH orgid=1
CONNECT BY prior orgid=parentorgid;

| level | orgname         |
|  1    | |--总公司        |
|  2    |   |--四川公司    |
|  3    |     |--成都公司  |
|  2    |   |--北京公司    |

SELECT level,
 lpad(' ',3*level-1)||'|--'||orgname AS orgname
FROM tb_org
START WITH orgid=1
CONNECT BY prior orgid=parentorgid
ORDER BY level;

| level | orgname         |
|  1    | |--总公司        |
|  2    |   |--四川公司    |
|  2    |   |--北京公司    |
|  3    |     |--成都公司  |

--完整路径
SELECT level,orgid,lpad(' ',3*level-1)||'|--'||orgname AS orgname,parentorgid,sys_connect_by_path(orgid,'/') path
FROM tb_org
START WITH orgid=1
CONNECT BY prior orgid=parentorgid;

| level | orgid | orgname         | parentorgid |   path   |
|  1    |   1   | |--总公司        |     null    |  /1      |
|  2    |   2   |   |--四川公司    |     1       |  /1/2    |
|  3    |   3   |     |--成都公司  |     2       |  /1/2/3  |
|  2    |   4   |   |--北京公司    |     1       |  /1/4    |

--查找根节点
SELECT level,orgid,lpad(' ',3*level-1)||'|--'||orgname AS orgname,connect_by_root orgid AS root,parentorgid,sys_connect_by_path(orgid,'/') path
FROM tb_org
START WITH orgid=1
CONNECT BY prior orgid=parentorgid;

| level | orgid | orgname         | parentorgid |root |   path   |
|  1    |   1   | |--总公司        |     null    |1    |  /1      |
|  2    |   2   |   |--四川公司    |     1       |1    |  /1/2    |
|  3    |   3   |     |--成都公司  |     2       |1    |  /1/2/3  |
|  2    |   4   |   |--北京公司    |     1       |1    |  /1/4    |

--是否叶子节点
SELECT level,orgid,lpad(' ',3*level-1)||'|--'||orgname AS orgname,connect_by_isleaf AS leaf,parentorgid,sys_connect_by_path(orgid,'/') path
FROM tb_org
START WITH orgid=1
CONNECT BY prior orgid=parentorgid;

| level | orgid | orgname         | parentorgid |leaf |   path   |
|  1    |   1   | |--总公司        |     null    |0    |  /1      |
|  2    |   2   |   |--四川公司    |     1       |0    |  /1/2    |
|  3    |   3   |     |--成都公司  |     2       |1    |  /1/2/3  |
|  2    |   4   |   |--北京公司    |     1       |1    |  /1/4    |

Comments are currently closed.