为什么不把value直接放在t_Tree中呢?难道每个ID有多个Value?
如果是那样的话,你这个就比较复杂了,我给你一个方法:
在t_Tree中加一个分片号字段(string型,不可重复,也不可用简单的数字表示),级别越高分片号越少,如t_Tree中根结点分片号为FP00,它有两个明细分别是FP00FP01,FP00FP02,往下推的明细的分片号都包含父结点的分片号。这样你在做查询时只需要select * from …… where 分片号 like "自己分片号%"
就可以把所有明细都取出来了。

解决方案 »

  1.   

    表:
    t_Tree(ID,Parent,Name)
    t_Detail(ID,Value)
    結果:
    合计出每个节点下的所有明细(包括级联的)的Value疑問:
      每個id有多個value明細嗎?如果只有一個,則可合并這兩個表。
    關于樹行sql,可以看sql reference的Hierarchical Queries
    SELECT employee_id, last_name, manager_id
    FROM employees
    CONNECT BY PRIOR employee_id = manager_id;
      

  2.   

    一个表设计:
    t_Tree(ID,Parent,Name,value)
    select lpad(' ',level*2+length(Name),' ')||Name||'--'||value
    from t_Tree
    connect by prior id = Parent
    start with Parent = 0;  --从0开始两个表就会打断树型结构
    t_Tree(ID,Parent,Name)
    t_Detail(ID,Value)
    作一个函数把所有value并在一起
      

  3.   

    一个表设计:
    t_Tree(ID,Parent,Name,value)
    select lpad(' ',level*2+length(Name),' ')||Name||'--'||value
    from t_Tree
    connect by prior id = Parent
    start with Parent = 0;  --从0开始两个表就会打断树型结构
    t_Tree(ID,Parent,Name)
    t_Detail(ID,Value)
    作一个函数把所有value并在一起
      

  4.   

    以上各位都没有弄明白我的意思(还是我没说清楚?)
    例如,t_Tree中有ID  Parent Name
    1   -1    A
    2   1      B
    3   1      C而t_Detail中有ID  Parent Value
    1   1      20
    2   2      10
    3   2      7
    4   3      15则我的期望结果是A   52(=20+10+7+15)
     B  17(=10+7)
     C  15
      

  5.   

    未测试
    select n,sum(v) over(order by n)
    from (select a.name n,b.value v 
            from t_tree a,t_detail b where a.id = b.parent
           group by a.name)
      

  6.   

    未测试
    select n,sum(v) over(order by n)
    from (select a.name n,sum(b.value) v 
            from t_tree a,t_detail b where a.id = b.parent
           group by a.name)
      

  7.   


    select n,sum(v) over(order by n desc )
    from (select a.name n,sum(b.value) v 
            from t_tree a,t_detail b where a.id = b.parent
           group by a.name)
      

  8.   

    select lpad(' ',level*2+length(c.name),' ')||c.name name,sum(decode(sign(level-c.Parent),1,c.value,0)) value from 
    (select a.id,a.Parent,a.value,b.name from t_Detail a,t_Tree b where a.ID=b.id(+)) c
    connect by prior c.id =c.Parent start with c.Parent =0查询语句大体是这样,但你的表数据最好是这样:
    ID  Parent Value
    1   0      20
    2   1      10
    3   1      7
    4   2      15
      

  9.   

    to beckhambobo(beckham):
    你的查询我试过了,语法有错,Oracle报ERROR 位于第 1 行: //第一行中的level
    ORA-00937: 非单组分组函数另外,你提到表数据最好是你建议的那样,为什么呢?是t_Detail中的Parent取值应该这样,还是t_Tree中的Parent取值应该这样?我的解决方案如下:
    写一个视图,先sum出树上每个节点的直接取值
    create view v_Tree_Detail as
    select a.Parent, a.ID, a.Name, sum(b.Value) Value
      from t_Tree a, t_Detail b
     where a.ID = b.Parent(+)
     group by a.Parent, a.ID, a.name
    /然后执行下面的SQL就可以统计出来了
    select Parent, ID, lpad(' ', level * 2, ' ')||Name Name,
           (select sum(value) value
              from v_Tree_Detail
            connect by prior ID = Parent
             start with ID = c.ID) Value
      from v_Tree_Detail c
    connect by prior ID = Parent
     start with Parent = -1;上面的查询中使用了一个子查询,可能对性能有影响。不知道有没有更好的方案?
    欢迎大家发表意见。
      

  10.   

    对v_Tree_Detail的第二次引用可以直接用t_Tree代替
      

  11.   

    做成一表,干嘛要两个表?
    SQL> select * from t_Detail;ID PARENT      VALUE NAME
    -- ------ ---------- ----------
    1  0              20 a
    2  1              10 b
    3  1               7 c
    4  2              15 SQL> select name,(select sum(value) from t_detail start with Parent=a.Parent connect by prior id =Parent) value from t_Detail a;NAME            VALUE
    ---------- ----------
    a                  52
    b                  32
    c                  32
                       15
      

  12.   

    to beckhambobo(beckham):
    就算我这里能做成一个表,但跟其它业务联系起来的时候,也会出现我提到的结构啊!例如一棵商品树(t_Tree),每种商品的销售记录(t_Detail)。这样在t_Detail中ID表示销售流水号,Parent表示商品,Value表示销售数量
    另外,你的做法跟我的思路核心是一样的了,但我测试时有个麻烦事:t_detail中有大约500,000条记录,统计需要4~5分钟才能得到结果。但我执行以下语句时却只需要最多只需要11~13秒:select * from v_Tree_Detail有没有办法优化一下这个查询,让它执行子查询的时候只在第一次从数据库中读取数据,而在以后都只在已经取出来的数据中查找和匹配。
      

  13.   

    用connect by 可以解决,不过如果记录较多,如几十万,性能严重下降
    需要优化
      

  14.   

    倒是建议你在t_detail中加个触发器,在t_tree中加个value字段,当t_detail数据发生变化时自动计算出t_tree中的value值,那样可能提高性能。