树型数据结构的库表设计问题 表结构如下, 
问题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.   

    Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用。
    创建示例表:
    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用法
      

  2.   

    想不用递归除非有严格的编码规则如
    第一级固定3位001、002、003、004......
    第二级id固定6位且前3位是第一级的编号,如001001、001002、001003......
    第三级id固定9位且前6位是第二级的编号,如001001001、001001002、001001003......
    ......根据这样的编码规则可以用like查找他的所有子节点
      

  3.   

    一楼已经回答了用START WITH CONNECT BY的语句来
    如果你不愿意用这种语句,则要语句写得复杂了
      

  4.   

    现在就是用START WITH CONNECT BY方式, 主要是数据量太大,20万条左右,还要关联 效率很低。
    能像 “5楼” 说的那样最好,不知道效率怎么样,而且需要手工维护,太麻烦了。
    而且排序也是一个问题。
      

  5.   

    使用START WITH CONNECT BY 进行查询下级
    使用ORDER SIBLINGS BY ,针对各个层次分别进行排序。这是最简单、快捷的方法了。
      

  6.   


    5楼的也是一种方式,不过这个code的取值是需要多考虑一下的,而且子树move到其他节点上的操作也需要重排code,不过查询上要快方便的多。而且是like '1000%' 这样的写法,所以index是可以用的。不过用start with  connect by会很差么,我觉得你可以先过滤掉没有用的记录,只对有用的记录做树形的整理呀。可以根据你们的需求给每条记录加个字段,用来标识这个记录是属于那颗树的。对一个数排序的时候,先只拿出这个树的所有记录,然后在用start with connect by来整理成树形。