ORACLE提供了一种树形结构用来实现层次查询:
- START WITH :指定记录是根节点的条件。根节点可以有多个。
- CONNECT BY :指定记录之间是父节点和子节点关系的条件。查找出含有子节点的父节点的条件
- PRIOR :指定父节点记录的引用。
- SIBLINGS :指定树的排序。同一父节点下的兄弟节点的顺序。
语法:
SELECT 。。。START WITH condition CONNECT BY condition;
Oracle使用树状结构的目的是:
1.用二维表的形式记录树状结构
2.查询二维表来构造树状结构,一般都是根据一个对象向上查询查出它所有的祖先,根据一个对象向下查询查出它所有的子孙
3.树状结构的特点就是一个子只有一个父,一个父可以有多个子。那只要每一个对象知道了他的父对象,就可以手动的构造出树状结构。也就是说,有多少个对象在二维表中就需要多少行,每一个对象都有一个指出它的父对象是字段。
树在数据库表中的存储结构,如下:
- create table TREE (
- ID NUMBER not null, //主键
- PID NUMBER not null, //父节点id
- ORDER_ID NUMBER not null, //排序id
- NODE_NAME VARCHAR2(100) not null, //节点名称
- constraint PK_TREE primary key (ID)
- );
实例sql语句如下:
- SELECT * FROM tree
- START WITH pid = 0
- CONNECT BY PRIOR id = pid
- ORDER SIBLINGS BY order_id
查询出来的结果就是按树排序的记录集。
注意:
1.先要确定查询哪个对象的祖先和子孙
这要用到START WITH condition,只要满足条件的行,都可以做为查询的对象,也就是说,在一个查询中可以查询多个对象的祖先和子孙
2.再确定对象的字段和父对象的字段,向上查询还是向下查询
CONNECT BY prior id = p_id 对象字段为id,父对象字段为p_id,向下查询
CONNECT BY id = prior p_id 对象字段为id,父对象字段为p_id,向上查询