Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按树形结构计算公司中的人数_Sql_Oracle_Hierarchical Data_Recursive Query - Fatal编程技术网

Sql 按树形结构计算公司中的人数

Sql 按树形结构计算公司中的人数,sql,oracle,hierarchical-data,recursive-query,Sql,Oracle,Hierarchical Data,Recursive Query,您好,我有一个包含公司id(PK)和父公司id(FK)列的结构表,以及包含公司id(FK)和人员id(PK)的人员表。有些人可能在不同的公司。我想数一数每个公司的数量,包括孩子 +------------------+-------------------------+ | companies_id(PK) | parent_companies_id(FK) | +------------------+-------------------------+ | 101 |

您好,我有一个包含公司id(PK)和父公司id(FK)列的结构表,以及包含公司id(FK)和人员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 |
+--------------+------------+

这里我假设您的
结构
表(我称之为“struct”)为每个公司都有一行。如果不是这样,你应该在驾驶台上使用不同的东西

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
;

你用的是什么数据库管理系统?@D-Shih我用的是Oracle