表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
不知道问题出在哪里?
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
不知道问题出在哪里?
a_id count(b_id)
4 6
5 3
6 1
7 2
6是如何算出来的,看不懂?
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
求5的时候7是5的后代,所以要统计所以要统计B表中b_a_id包含5,7的个数共3个
同理6的为1,
7的为2
我理解的没错吧。可是还没相处SQL。郁闷
(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
count(1)简单啊
已连接。
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>
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个同理。