ORACLE提供了一种树形结构用来实现层次查询:
START WITH :指定记录是根节点的条件。根节点可以有多个。
CONNECT BY :指定记录之间是父节点和子节点关系的条件。查找出含有子节点的父节点的条件
PRIOR :指定父节点记录的引用。
SIBLINGS :指定树的排序。同一父节点下的兄弟节点的顺序。
树在数据库表中的存储结构,如下:
create table TREE (
ID NUMBER not null, //主键
PID NUMBER not null, //父节点id
ORDER_ID NUMBER not null, //排序id
NODE_NAME VARCHAR2(100) not null, //节点名称
DEL VARCHAR2(5), //删除标识 1:为删除
constraint PK_TREE primary key (ID)
);
实例sql语句如下:
SELECT * FROM tree WHERE del <> 1 START WITH pid = 0 AND del <> 1
CONNECT BY PRIOR id = pid AND del <> 1 ORDER SIBLINGS BY order_id
查询出来的结果就是按树排序的记录集。
如果用到了逻辑删除(假删除),那么上述sql语句中三处的del <> 1的意义是不同的。第一处是在表中全部记录中筛选出没有被标记删除的记录(缩短生成树的计算范围),第二处是筛选出根节点没有被标记删除的根节点的记录,第三处是是筛选出含有子节点的父节点没有被标记删除的父节点的记录