你好,我有一个带有companies_id(PK(和parent_companies_id(FK(列的结构表以及带有companies_id(FK(和people_id(PK(的人表。有些人可以在不同的公司工作。我想计算包括孩子在内的每个公司的数量。
+------------------+-------------------------+
| companies_id(PK) | parent_companies_id(FK) |
+------------------+-------------------------+
| 101 | null |
| 102 | 101 |
| 103 | 101 |
| 104 | 103 |
| 105 | 103 |
| 106 | 104 |
+------------------+-------------------------+
+---------------+------------------+
| people_id(PK) | companies_id(FK) |
+---------------+------------------+
| 001 | 101 |
| 002 | 102 |
| 003 | 102 |
| 004 | 104 |
| 005 | 105 |
| 006 | 106 |
+---------------+------------------+
CREATE TABLE COMPANY
( Company_ID Integer,
Parent_ID Integer
);
CREATE TABLE PEOPLE
( People_ID VARCHAR(3),
Company_ID Integer
);
INSERT INTO COMPANY VALUES (101,NULL);
INSERT INTO COMPANY VALUES (102,101);
INSERT INTO COMPANY VALUES (103,101);
INSERT INTO COMPANY VALUES (104,103);
INSERT INTO COMPANY VALUES (105,103);
INSERT INTO COMPANY VALUES (106,104);
INSERT INTO PEOPLE VALUES ('001',101);
INSERT INTO PEOPLE VALUES ('002',102);
INSERT INTO PEOPLE VALUES ('003',102);
INSERT INTO PEOPLE VALUES ('004',104);
INSERT INTO PEOPLE VALUES ('005',105);
INSERT INTO PEOPLE VALUES ('006',106);
结果必须是下一个
+--------------+------------+
| companies_id | people_qnt |
+--------------+------------+
| 101 | 6 |
| 102 | 2 |
| 103 | 3 |
| 104 | 2 |
| 105 | 1 |
| 106 | 1 |
+--------------+------------+
我在这里假设您的structure
表(我称之为"结构"(对每个公司都有一行。如果不是这样,您应该为驱动表使用不同的东西。
select struct.companies_id, count(people_id)
from struct
inner join people on people.companies_id in
(select s2.companies_id
from struct s2
start with s2.companies_id = struct.companies_id
connect by prior s2.companies_id = s2.parent_companies_id)
group by struct.companies_id
order by 1
;
Sqlfiddle