表A:(a_id为主键)                        
a_id  a_parent_id 
0      
1      0 
2      0 
3      0 
4      2 
5      4 
6      4 
7      5  表B:(b_id为主键,b_a_id为外键,对应表A的a_id) 
b_id  b_a_id  b_name 
1      4      n1 
2      4      n2 
3      5      n3 
4      6      n4 
5      7      n5 
6      7      n6表A中,5,6 的父id 为 4,7的父亲id为5目标:
按 b_a_id 统计表b中数据,如果统计的b_a_id有下级id,则统计的时候要一起统计下级id对应的记录 希望得到的统计的结果: 
a_id  count(b_id) 
4      6 
5      3 
6      1 
7      2  --------------------------
我试着在plsql中这样写:SELECT B.b_a_id, COUNT(b_id) 
  FROM B 
WHERE B.b_a_id IN 
      (SELECT A.a_id 
          FROM A 
        START WITH A.a_id = B.b_a_id 
        CONNECT BY A.a_parent_id = PRIOR A.a_id) 
GROUP BY B.b_a_id 得到的查询结果是:
a_id  count(b_id) 
4      2 
5      1 
6      1 
7      2  
不知道问题出在哪里?

解决方案 »

  1.   

    数据怎么会是
    a_id  count(b_id) 
    4      6 
    5      3 
    6      1 
    7      2  
    6是如何算出来的,看不懂?
      

  2.   

    表B中数据为:
    b_id  b_a_id  b_name 
    1      4      n1 
    2      4      n2 
    3      5      n3 
    4      6      n4 
    5      7      n5 
    6      7      n6 按表B中字段 b_a_id 统计count条数b_a_id = 4 时: 
    (1)自身有2条数据
    (2)联查表A中字段 a_id : a_id = 5,a_id = 6 为4 的下级,表B中 b_a_id 为 5,6 对应的记录条数共2条
    (3)联查表A中字段 a_id : a_id = 7 为5 的下级,表B中 b_a_id 为 7 对应的记录条数2条
    因此 b_a_id count出来总共为 6 条记录。
    以此类推,即统计的时候要统计下级数据求count
      

  3.   

    统计4的时候,因为5,6,7都是4的后代。所以要统计B表中b_a_id包含4,5,6,7的总个数共6个
    求5的时候7是5的后代,所以要统计所以要统计B表中b_a_id包含5,7的个数共3个
    同理6的为1,
    7的为2
    我理解的没错吧。可是还没相处SQL。郁闷
      

  4.   

    方法如下:SELECT B_A_ID,
           (SELECT COUNT(1)
              FROM B
             WHERE B_A_ID IN (SELECT A_ID
                                FROM A
                               START WITH A_ID = BX.B_A_ID
                              CONNECT BY PRIOR A_ID = A_PARENT_ID)) COUNT
      FROM B BX
     GROUP BY B_A_ID
     ORDER BY 1;输出如下:
    B_A_ID COUNT
    4 6
    5 3
    6 1
    7 2
      

  5.   

    谢谢各位,不过我没看懂什么意思?能否解释一下?select count(1) ?
      

  6.   

    COUNT(b_id)也可以啊。
    count(1)简单啊
      

  7.   

    SQL> conn tt/tt
    已连接。
    SQL> select * from aa;      A_ID A_PARENT_ID
    ---------- -----------
             0
             1           0
             2           0
             3           0
             4           2
             5           4
             6           4
             7           5已选择8行。SQL> select *from bb;      B_ID     B_A_ID B_NAME
    ---------- ---------- --------------------
             1          4 n1
             2          4 n2
             3          5 n3
             4          6 n4
             5          7 n5
             6          7 n6已选择6行。SQL> select "no", sum(tc)
      2    from (select connect_by_root aid "no", tc
      3            from (select aa.a_id aid, aa.a_parent_id apid, nvl(bb.tc, 0) tc
      4                    from aa
      5                    left join (select b_a_id, count(1) tc
      6                                from bb
      7                               group by b_a_id) bb on bb.b_a_id = aa.a_id)
      8          connect by prior aid = apid)
      9   where exists (select 1 from bb where "no" = bb.b_a_id)
     10   group by "no"
     11   order by "no"
     12  /        no    SUM(TC)
    ---------- ----------
             4          6
             5          3
             6          1
             7          2SQL>
      

  8.   

    SELECT A_ID
                                FROM A
                               START WITH A_ID = BX.B_A_ID
                              CONNECT BY PRIOR A_ID = A_PARENT_ID)
    这句是得到bx.b_a_id的后代,关于connect by的用法。自己研究下。如BX.B_A_ID为4的话就得到4,5,6,7然后计算count(b_a_id)where in 4,5,6,7所以得到总和为6个同理。