使用oracle 9i 里的层级查询(Hierarchical Queries)实现树状表结构的递归数据查询
2007-08-21 01:06
1076 查看
先来看2张图:
这个图展示了ORACLE查询一个层级树时的返回顺序,从Root节点开始返回该Root的一个子节点,
然后再返回该子节点的子节点,一直到叶结点.
在下一个有子节点的节点被找到并且该节点不是叶结idan以前,层级会逐渐增加,并且Oracle返回该节点
当Root节点的第一个节点的所有的"子孙(descendants)"节点被返回后,Oracle才会去查找下一个子节点,这个过程将一直持续.(深度优先)
(This process continues, with Oracle returning to the root row for the next child
only when all of the "descendants" of the first child row have been returned.)
这个图说明了 Hierarchical Queries 的语法
1.以指定的层级根不开始
2.由指定的层级中父子关系连接,在一个层级查询中,条件表达式必须使用PRIOR运算符限定查取父级数据.
比喻:
... PRIOR expr = expr
or
... expr = PRIOR expr
如果CONNECT BY是符合条件,那么只有一个条件限定PRIOR运算符.(例子将在下面给出)
先建表,插入一些数据:
Create Table TreeDemo (
NodeID NVARCHAR2(50) Default '' Not Null,
Parent_NodeID NVARCHAR2(50) Default '' Not Null,
NodeName NVARCHAR2(100) Default '' Not Null
, Constraint PK_TreeDemo Primary Key (NodeID)
);
insert into TreeDemo values('A',0,'A_1');
insert into TreeDemo values('A01','A','A_01');
insert into TreeDemo values('A02','A','A_02');
insert into TreeDemo values('A03','A01','A_03');
insert into TreeDemo values('A04','A01','A_02');
用这LPAD和SYS_CONNECT_BY_PATH函数把树型结构构造出来
LPAD 函数将左边的字符串填充特定的字符空格
SYS_CONNECT_BY_PATH ORACLE树结构专用函数
SELECT LPAD(' ', 2*level-1)||SYS_CONNECT_BY_PATH(NodeName, '/') "TREE"
FROM TreeDemo
start with NodeID = 'A04'
connect by prior NodeID = Parent_NodeID ;
结果为:
TREE
---------------------
/A_02
/A_02/A_01
/A_02/A_01/A_1
在使用 start with ....connect by prio 查询前需要注意一点:
如果 prio 后面的关系弄反了查出来的结果是不一样的.
看看下面2条查询语句的结果:
1.这种查询将把当前符合条件的节点作为根节点遍历查询其所属子节点:
select * from TreeDemo
start with NodeID = 'A01'
connect by prior NodeID = Parent_NodeID ;
NODEID PARENT_NODEID NODENAME
--------- ------------- ---------
A01 A A_01
A03 A01 A_03
A04 A01 A_03
2.这种查询将由叶结点遍历查询到根节点:
start with NodeID = 'A04'
connect by prior Parent_NodeID = NodeID ;
NODEID PARENT_NODEID NODENAME
--------- ------------- ---------
A04 A01 A_02
A01 A A_01
A 0 A_1
3.带条件过滤:
select * from TreeDemo
start with NodeID = 'A04'
connect by PARENT_NODEID <>'0' and prior Parent_NodeID = NodeID ;
NODEID PARENT_NODEID NODENAME
--------- ------------- ---------
A04 A01 A_02
A01 A A_01
也可在查询里加上排序条件,可以看出在ORACLE里处理这种树型数据表是很方便的,在MS SQL 里可能要写函数处理.
这个图展示了ORACLE查询一个层级树时的返回顺序,从Root节点开始返回该Root的一个子节点,
然后再返回该子节点的子节点,一直到叶结点.
在下一个有子节点的节点被找到并且该节点不是叶结idan以前,层级会逐渐增加,并且Oracle返回该节点
当Root节点的第一个节点的所有的"子孙(descendants)"节点被返回后,Oracle才会去查找下一个子节点,这个过程将一直持续.(深度优先)
(This process continues, with Oracle returning to the root row for the next child
only when all of the "descendants" of the first child row have been returned.)
这个图说明了 Hierarchical Queries 的语法
1.以指定的层级根不开始
2.由指定的层级中父子关系连接,在一个层级查询中,条件表达式必须使用PRIOR运算符限定查取父级数据.
比喻:
... PRIOR expr = expr
or
... expr = PRIOR expr
如果CONNECT BY是符合条件,那么只有一个条件限定PRIOR运算符.(例子将在下面给出)
先建表,插入一些数据:
Create Table TreeDemo (
NodeID NVARCHAR2(50) Default '' Not Null,
Parent_NodeID NVARCHAR2(50) Default '' Not Null,
NodeName NVARCHAR2(100) Default '' Not Null
, Constraint PK_TreeDemo Primary Key (NodeID)
);
insert into TreeDemo values('A',0,'A_1');
insert into TreeDemo values('A01','A','A_01');
insert into TreeDemo values('A02','A','A_02');
insert into TreeDemo values('A03','A01','A_03');
insert into TreeDemo values('A04','A01','A_02');
用这LPAD和SYS_CONNECT_BY_PATH函数把树型结构构造出来
LPAD 函数将左边的字符串填充特定的字符空格
SYS_CONNECT_BY_PATH ORACLE树结构专用函数
SELECT LPAD(' ', 2*level-1)||SYS_CONNECT_BY_PATH(NodeName, '/') "TREE"
FROM TreeDemo
start with NodeID = 'A04'
connect by prior NodeID = Parent_NodeID ;
结果为:
TREE
---------------------
/A_02
/A_02/A_01
/A_02/A_01/A_1
在使用 start with ....connect by prio 查询前需要注意一点:
如果 prio 后面的关系弄反了查出来的结果是不一样的.
看看下面2条查询语句的结果:
1.这种查询将把当前符合条件的节点作为根节点遍历查询其所属子节点:
select * from TreeDemo
start with NodeID = 'A01'
connect by prior NodeID = Parent_NodeID ;
NODEID PARENT_NODEID NODENAME
--------- ------------- ---------
A01 A A_01
A03 A01 A_03
A04 A01 A_03
2.这种查询将由叶结点遍历查询到根节点:
start with NodeID = 'A04'
connect by prior Parent_NodeID = NodeID ;
NODEID PARENT_NODEID NODENAME
--------- ------------- ---------
A04 A01 A_02
A01 A A_01
A 0 A_1
3.带条件过滤:
select * from TreeDemo
start with NodeID = 'A04'
connect by PARENT_NODEID <>'0' and prior Parent_NodeID = NodeID ;
NODEID PARENT_NODEID NODENAME
--------- ------------- ---------
A04 A01 A_02
A01 A A_01
也可在查询里加上排序条件,可以看出在ORACLE里处理这种树型数据表是很方便的,在MS SQL 里可能要写函数处理.
相关文章推荐
- 使用oracle 9i 里的层级查询(Hierarchical Queries)实现树状表结构的递归数据查询
- 浅谈oracle树状结构层级查询测试数据
- MySql的sql语句中添加存储过程或者存储函数来实现Oracle中的start with ……connect by prior……递归(树形结构数据)查询
- MySQL使用递归存储过程实现树状结构,实现Oracle的Connect By 功能
- iOS:二叉树多级表格的使用,使用三方库TreeTableView-master实现对json解析数据的递归遍历整理成树状结构
- MySQL使用递归存储过程实现树状结构,实现Oracle的Connect By 功能在Mysql中如何实现Oracle中的递归
- PHP 递归实现层级树状展现数据
- SQLServer实现树型结构数据查询的存储过程,类似oracle的connect by
- [转]树结构表递归查询在ORACLE和MSSQL中的实现方法
- 树结构表递归查询在ORACLE和MSSQL中的实现方法 [续]
- ORACLE 树形结构数据 查询某结点下全部子节点无限递归的前2个数据
- 在Silverlight中使用HierarchicalDataTemplate为TreeView实现递归树状结构
- C#使用Jquery zTree实现树状结构显示_异步数据加载
- C#使用Jquery zTree实现树状结构显示 异步数据加载
- 在ORACLE、MSSQL、MYSQL中树结构表递归查询的实现方
- oracle 递归 树形结构数据查询
- CTE递归应用,树状结构,查询所有子部门、子部门数量、按层级显示部门名称
- 实现了一个SQL查询整个树状结构数据的方法!找更好的!
- Oracle中使用connect by 来实现树状查询
- 使用Oracle数据库实现树形结构表的子-父级迭代(递归)查询和删除,通过级联菜单简单举例