我现在建立了一棵结构树,
但是存在问题,1级节点下面有2级节点,有的2级节点下有3级节点,有的2级节点下没亦3级节点,现在想
把有3级节点的2级节点放在上部,没有3级节点的2级节点放在下部。
怎么办?
各位请多帮忙。图例1
   12 
       121
       122
   13
       131
       132
   14
   15
   
...

解决方案 »

  1.   

    利用union all就可以啊,先排列前面有三级节点的,然后在排列没有三级节点的
      

  2.   

    select * from tb a where a.lv=2 and exists (select b.code from tb b where  b.code like a.code||'%' and b.lv=3) order by a.code
     union
    select * from tb a where a.lv=2 and not exists (select b.code from tb b where b.code like a.code||'%' and b.lv=3)
    很直接的一个实现。
    如果你的表里面有一个字段标识是否有子节点的话,那样就更容易实现了。
      

  3.   

    select t1.part_blprnt || '-' || part_name as bl_nm, 
    level as part_level from (select * from erp.v_dsgn_prdct_fit_tree_dsp where prdct_id=1034907 
    and part_lvl=1 order by prnt_id,part_id) t1 
    start with prnt_id=-1 
    connect by nocycle prior part_id = prnt_id order by level; 这是我用的语句但是这个只能排出1,2级的关系,而无法分开2级有没有3级 
    prnt_id 就是parent_id上一级的着急!!!!
      

  4.   

    b.code like a.code||'%' 这个是什么意思?
      

  5.   

    我写的tb就是你的tree表
    code就是你的tree表中的节点标识字段,lv就是你的level字段。
    看你的节点是有规律的,子节点由父节点加上某个数构成,那就是说如果第2级有子节点,那么就存在节点表示与之相似的。
    修改下我写 的,漏了点东西
    select * from erp.v_dsgn_prdct_fit_tree_dsp a where a.level=2 and exists (select b.code from erp.v_dsgn_prdct_fit_tree_dsp b where  b.code like a.code||'%' and b.code<>a.code and b.lv=3) order by a.code 
    union 
    select * from erp.v_dsgn_prdct_fit_tree_dsp a where a.level=2 and not exists (select b.code from erp.v_dsgn_prdct_fit_tree_dsp b where b.code like a.code||'%' and b.code<>a.code and b.lv=3) order by a.code 
      

  6.   

    朋友您好!
    select t1.part_blprnt || '-' || part_name as bl_nm, part_id,prnt_id
    level as part_level from (select * from erp.v_dsgn_prdct_fit_tree_dsp where prdct_id=1034907 
    and part_lvl=1 order by prnt_id,part_id) t1 
    start with prnt_id=-1 
    connect by nocycle prior part_id = prnt_id order by level; 
    执行这个语句显示的数据项为
    part_id,prnt_id,bl_nm,part_level
    part_id表示零件id,prnt_id表示零件的装入id(也就是上一级的part_id),part_level表示等级,bl_nm现实名称。如何 写语句,请指教
      

  7.   

    oracle 10g中有一个connect by下面提供一个范例你参考下
    select dirindex, fatherindex, RPAD(' ', 2*(LEVEL-1)) || dirname from t_tonedirlib
    start with fatherindex = 0
    connect by  fatherindex =  prior dirindex
      

  8.   

    order by 3 nulls last