当前位置: 代码迷 >> Oracle管理 >> sql语句树的计算
  详细解决方案

sql语句树的计算

热度:24   发布时间:2016-04-24 04:20:33.0
求一个sql语句树的计算
有一个表。
dept(id ,p_id,mc)记录了上下级关系
一个业务表
tab_name(id,dept_id);
现在在dept里面选择N个部门,求出部门里面 tab_name里面这N个部门的值,这个部门有可能有很多下级
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

有一个表。
dept(id ,p_id,mc)记录了上下级关系
一个业务表
tab_name(id,dept_id);
现在在dept里面选择N个部门,求出部门里面 tab_name里面这N个部门的值,这个部门有可能有很多下级

不是很清楚你的需求,最好能够通过模拟数据来描述你需要的结果

dept 表 
id mc pid
1   a     
2   b   
3   c    
4   a1  1
5   b1  2
6   c1  3
7   a11 1
8   b11 2
9  c11  3
业务数据全部是有 7、8 、 9来
tabname 
id dept_id
1    7
2    7
3    8
4    9 
5    7
6    7
我的统计根据选择dept 表来进行计算。
加入我们同时选择 a,b,c 则统计数据为:
a  4
b  1 
c  1 
如果我们选择 a b
a 4 
b 1 
我现在能通过start with connect by 统计出a=4 ,b=1 ,c=1 但是我的这个统计只能单个出来,不能同时出来。 



这里的选择 还有可能是  a c1等 不规则的选择




with t1 as
 (select 1 id, 'a' mc, null pid
    from dual
  union all
  select 2 id, 'b' mc, null pid
    from dual
  union all
  select 3 id, 'c' mc, null pid
    from dual
  union all
  select 4 id, 'a1' mc, 1 pid
    from dual
  union all
  select 5 id, 'b1' mc, 2 pid
    from dual
  union all
  select 6 id, 'c1' mc, 3 pid
    from dual
  union all
  select 7 id, 'a11' mc, 1 pid
    from dual
  union all
  select 8 id, 'b11' mc, 2 pid
    from dual
  union all
  select 9 id, 'c11' mc, 3 pid
    from dual),
t2 as
 (select 1 id, 7 dept_id
    from dual
  union all
  select 2 id, 7 dept_id
    from dual
  union all
  select 3 id, 8 dept_id
    from dual
  union all
  select 4 id, 9 dept_id
    from dual
  union all
  select 5 id, 7 dept_id
    from dual
  union all
  select 6 id, 7 dept_id
    from dual)
select count(t2.id), root_id
  from t2,
       (select t1.*, CONNECT_BY_ROOT(mc) root_id
          from t1
         start with mc in ('a', 'b', 'c', 'a1', 'a11')
        connect by pid = prior id) t3
 where t2.dept_id(+) = t3.id
 group by root_id
  相关解决方案