树型数据结构的库表设计问题 表结构如下,
问题1、怎样不用递归的情况 查询全部下级,
问题2、查询全部下级后 怎样按照层级排序,同一层级按照 order_id 排序
如果觉得字段不够可以加字段,能解决问题就行TREE_ID VARCHAR2(20) 树节点编号
TREE_NAME VARCHAR2(255) 树节点名称
TREE_ABBR VARCHAR2(100) 树节点简称
PARENT_TREE_ID VARCHAR2(20) 父节点编号
TREE_GRADE INTEGER 树节点级别
TREE_TYPE INTEGER 树节点类型
ORDER_ID INTEGER 0 排列序号
问题1、怎样不用递归的情况 查询全部下级,
问题2、查询全部下级后 怎样按照层级排序,同一层级按照 order_id 排序
如果觉得字段不够可以加字段,能解决问题就行TREE_ID VARCHAR2(20) 树节点编号
TREE_NAME VARCHAR2(255) 树节点名称
TREE_ABBR VARCHAR2(100) 树节点简称
PARENT_TREE_ID VARCHAR2(20) 父节点编号
TREE_GRADE INTEGER 树节点级别
TREE_TYPE INTEGER 树节点类型
ORDER_ID INTEGER 0 排列序号
创建示例表:
CREATE TABLE TBL_TEST
(
ID NUMBER,
NAME VARCHAR2(100 BYTE),
PID NUMBER DEFAULT 0
);
插入测试数据:
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('1','10','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('2','11','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('3','20','0');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('4','12','1');
INSERT INTO TBL_TEST(ID,NAME,PID) VALUES('5','121','2');
从Root往树末梢递归
select * from TBL_TEST
start with id=1
connect by prior id = pid
从末梢往树ROOT递归
select * from TBL_TEST
start with id=5
connect by prior pid = id参考一下connect by用法
第一级固定3位001、002、003、004......
第二级id固定6位且前3位是第一级的编号,如001001、001002、001003......
第三级id固定9位且前6位是第二级的编号,如001001001、001001002、001001003......
......根据这样的编码规则可以用like查找他的所有子节点
如果你不愿意用这种语句,则要语句写得复杂了
能像 “5楼” 说的那样最好,不知道效率怎么样,而且需要手工维护,太麻烦了。
而且排序也是一个问题。
使用ORDER SIBLINGS BY ,针对各个层次分别进行排序。这是最简单、快捷的方法了。
5楼的也是一种方式,不过这个code的取值是需要多考虑一下的,而且子树move到其他节点上的操作也需要重排code,不过查询上要快方便的多。而且是like '1000%' 这样的写法,所以index是可以用的。不过用start with connect by会很差么,我觉得你可以先过滤掉没有用的记录,只对有用的记录做树形的整理呀。可以根据你们的需求给每条记录加个字段,用来标识这个记录是属于那颗树的。对一个数排序的时候,先只拿出这个树的所有记录,然后在用start with connect by来整理成树形。