如果数据存储为树形结构的话, 可以查询某个节点下的所有子节点以及叶子节点。如: 16:52:33 SQL> select * from ttree;ID PID PRICE ---------- ---------- ---------- B A 20 D B 3 E B 5 G D 2 C A 1 F C 2 G C 5 G H 3已选择8行。已用时间: 00: 00: 00.93 17:04:16 SQL> select * from ttree start with id='B' connect by prior id=pid;ID PID PRICE ---------- ---------- ---------- B A 20 D B 3 G D 2 E B 5已用时间: 00: 00: 00.32 17:04:49 SQL> 查询了从节点B下的所有子节点(D),以及叶子节点(G,E)
这种语法是oracle中树型结构查询的语法。
start with orgid=orgid connect by prior porgid=orgid 这部分为什么这么写
select * from org start with orgid=56 connect by prior porgid=56 比如这个,怎么解释
你的语句不好。 17:04:16 SQL> select * from ttree start with id='B' connect by prior id=pid;ID PID PRICE ---------- ---------- ---------- B A 20 D B 3 G D 2 E B 5对于每一行的id,它的父节点为pid所指向的id 这一行: D B 3 D的父节点为B,以此类推。 找出所有B的子节点(start with id='B')
prior也算是关键字吧?就是 上一个的意思?
orgid=porgid porgid=orgid 最后这两种写法,区别?
TREE_TABLE有以下字段 ID、UPPER_ID、CODE、NAME、DESCRIPTION 0 FIRST 第一 我是第一 1 0 SECOND 第二 我是第二 SELECT T.CODE,T.NAME FROM TREE_TABLE CONNECT BY PRIOR T.ID = T.UPPER_ID START WITH ID = 0 | | ----第一 | |-----第二 | |-----第三 如果改变START WITH 后的值,就是从全树截取一部分成为一棵子树,ID的值就是子树的根 SELECT T.CODE,T.NAME FROM TREE_TABLE CONNECT BY PRIOR T.UPPER_ID = T.ID START WITH ID = 0 PRIOR后的表达式表示建树的顺序,一个是从根往叶查询建树,一个是从叶往根查询建树。
CONNECT BY ORGID = PRIOR PORGID 从树的叶到根的相关记录 CONNECT BY PORGID = PRIOR ORGID 从树的根到所有相关的叶结点的记录
一个表如果有这样两列,其中一列的值总能在另一列中找到,前者为子列,后者为父列。这种情况适合树结构查询。树查询是在标准select语句中增加了connect by 、start with两个子句完成的。以搂住的部门表为例,每一个部门应该有上一级部门(最上一级部门除外),则部门表应该包括这两个列:本部门(子列)、上级部门(父列),通过这两个列的关联可以进行类似查找某个部门以下的所有下属部门或这个部门以上所有上级部门。start with 以满足某个条件的记录为起点开始查询,connect by 与关键字prior 一起表示当前选定记录的orgid的值必须等于之前返回的记录中的porgid的值。SQL> select * from org; ORGID NAME PORGID ---------- -------------------- ---------- 0 总裁办公室 0 1 研发部 0 2 总务处 0 3 开发部 1 4 测试部 1 5 后勤部 2 6 OA部 2 7 采购部 2 8 财务部 2 9 电信开发部 3 9 网络开发部 3 ORGID NAME PORGID ---------- -------------------- ---------- 10 物流开发部 3已选择12行。 研发部及其下属部门的查找: SQL> select * from org connect by porgid=prior orgid start with orgid=1; ORGID NAME PORGID ---------- -------------------- ---------- 1 研发部 0 3 开发部 1 9 电信开发部 3 9 网络开发部 3 10 物流开发部 3 4 测试部 1已选择6行。 总务处及其下属部门的查找: SQL> select * from org connect by porgid=prior orgid start with orgid=2; ORGID NAME PORGID ---------- -------------------- ---------- 2 总务处 0 5 后勤部 2 6 OA部 2 7 采购部 2 8 财务部 2
可以查询某个节点下的所有子节点以及叶子节点。如:
16:52:33 SQL> select * from ttree;ID PID PRICE
---------- ---------- ----------
B A 20
D B 3
E B 5
G D 2
C A 1
F C 2
G C 5
G H 3已选择8行。已用时间: 00: 00: 00.93
17:04:16 SQL> select * from ttree start with id='B' connect by prior id=pid;ID PID PRICE
---------- ---------- ----------
B A 20
D B 3
G D 2
E B 5已用时间: 00: 00: 00.32
17:04:49 SQL> 查询了从节点B下的所有子节点(D),以及叶子节点(G,E)
这部分为什么这么写
比如这个,怎么解释
17:04:16 SQL> select * from ttree start with id='B' connect by prior id=pid;ID PID PRICE
---------- ---------- ----------
B A 20
D B 3
G D 2
E B 5对于每一行的id,它的父节点为pid所指向的id
这一行:
D B 3
D的父节点为B,以此类推。
找出所有B的子节点(start with id='B')
porgid=orgid
最后这两种写法,区别?
0 FIRST 第一 我是第一
1 0 SECOND 第二 我是第二
SELECT T.CODE,T.NAME FROM TREE_TABLE CONNECT BY PRIOR T.ID = T.UPPER_ID START WITH ID = 0
|
| ----第一
|
|-----第二
|
|-----第三
如果改变START WITH 后的值,就是从全树截取一部分成为一棵子树,ID的值就是子树的根
SELECT T.CODE,T.NAME FROM TREE_TABLE CONNECT BY PRIOR T.UPPER_ID = T.ID START WITH ID = 0
PRIOR后的表达式表示建树的顺序,一个是从根往叶查询建树,一个是从叶往根查询建树。
CONNECT BY PORGID = PRIOR ORGID 从树的根到所有相关的叶结点的记录
---------- -------------------- ----------
0 总裁办公室 0
1 研发部 0
2 总务处 0
3 开发部 1
4 测试部 1
5 后勤部 2
6 OA部 2
7 采购部 2
8 财务部 2
9 电信开发部 3
9 网络开发部 3 ORGID NAME PORGID
---------- -------------------- ----------
10 物流开发部 3已选择12行。
研发部及其下属部门的查找:
SQL> select * from org connect by porgid=prior orgid start with orgid=1; ORGID NAME PORGID
---------- -------------------- ----------
1 研发部 0
3 开发部 1
9 电信开发部 3
9 网络开发部 3
10 物流开发部 3
4 测试部 1已选择6行。
总务处及其下属部门的查找:
SQL> select * from org connect by porgid=prior orgid start with orgid=2; ORGID NAME PORGID
---------- -------------------- ----------
2 总务处 0
5 后勤部 2
6 OA部 2
7 采购部 2
8 财务部 2