Oracle在部门表上使用递归通过父部门的code查询所有子部门

该博客主要讲述了在Oracle中,通过递归的方式,依据父部门的code来查询其所有子部门的相关内容,涉及数据库的查询操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ORG_CODE RS GZ TJZJ LEADE_ID 60899000 80830000 80830500 80829500 80829000 30001 100 200 300 300 30002 101 201 301 300 30003 102 202 302 300 30004 103 203 303 300 30501 104 204 304 305 30502 105 205 305 305 30503 106 206 306 305 30512 107 207 307 305 29501 108 208 308 295 29504 109 209 309 295 29511 110 210 310 295 29012 111 211 311 290 29013 112 212 312 290 29005 113 213 313 290 在oracle数据库中,我现在有一张公司,其中部门编号、部门人数、工资、团建资金、小组的级关系,这几个字段(只有小组由有级关系,可根据部门编码中看出相对应的关系,如:技术部80830000,技术部下的小组a30001、小组b30002、小组c30003,可以根据其级id对应出部门编码中的‘80830000’中提取300这中间三位数,对应小组的级id),中的部门分为3个层级:公司、部门、小组,现在中只有第3层小组有数据,要求在该上统计每个部门的总人数和公司的总人数、每个部门的总工资和公司的总工资、每个部门的团建资金和公司总团建资金,其中60899000是公司编号,应该如何去写这段查询SQL语句,不使用cte递归,结果展示为:部门编号、总人数、总工资、总团建资金,要求最后统计的结果展示为:部门编码、总人数、总工资、总团建资金,其中部门编码中有:公司、部门、小组,原有的小组数据逐层汇总到部门、公司,我给的数据中不止一个部门,有好几个部门,不进行无数据部门节点排除,每个部门都有其下的小组,小组中都有数据。(层级关系有问题,公司编码是定死的跟部门编码无丝毫关联,只需要知道60899000是公司编码,需要汇总所有数据;部门编码是80827000,其下小组编码是27001,他们的关系是部门编码的270这三位和小组编码的前三位270,是以这样进行上下关系联系的;部门层级是提取‘80827000’中的‘270’、‘80827500’的‘275’,小组层级的是提取'27001'的前三位‘270’、‘27013’的‘270’、‘27501’的‘275’)
最新发布
04-01
<think>嗯,用户想要在Oracle数据库中根据部门和小组成员的层级关系汇总总人数、总工资和团建资金。公司编码是固定的60899000,部门编码和小组编码的关系是通过中间三位和前三位匹配的。首先,我需要理清楚层级结构是怎样的。公司下面是部门部门下面是小组,对吧? 那部门编码和小组编码的关系是部门编码的中间三位等于小组编码的前三位。比如说,假设部门编码是XXX中间三位是ABC,那么小组编码的前三位也应该是ABC。这样的话,如何关联部门和小组呢?可能需要用字符串函数来提取中间三位和前三位,比如SUBSTR函数。 接下来,用户需要汇总各个层级的数据,包括公司、部门、小组。可能需要使用层次查询或者递归的CTE(公用达式)来构建层级结构。不过Oracle有CONNECT BY语法,可以用来处理层次结构。或者用递归CTE的WITH句。 假设有一个员工,里面有部门编码、小组编码、人数、工资、团建资金等信息。需要将这些数据按层级汇总。首先,可能需要将各个小组的数据汇总到部门,再将部门的数据汇总到公司。或者同时处理所有层级。 可能需要使用GROUP BY ROLLUP或者GROUPING SETS来生成不同层级的汇总。不过ROLLUP可能会自动生成小计和总计,但这里层级关系比较特殊,需要根据部门编码和小组编码的匹配规则来建立层级,可能需要先构建一个层次结构,再进行汇总。 例如,先构建一个部门和小组成员的层级,然后通过连接员工数据,使用层次查询进行汇总。或者使用UNION ALL将不同层级的汇总结果合并。 具体步骤可能如下: 1. 提取部门编码的中间三位,作为部门标识。 2. 提取小组编码的前三位,与部门标识匹配,确定所属部门。 3. 构建层次结构,公司->部门->小组。 4. 使用CONNECT BY或者递归CTE来遍历层次结构。 5. 使用聚合函数SUM和GROUP BY来汇总数据。 6. 确保公司级别的汇总包括所有数据。 另外,需要注意部门编码是公司下的,公司编码固定为60899000,所以可能需要将公司作为根节点,部门作为节点,小组作为孙节点。然后通过层次查询将各层的汇总数据计算出来。 可能需要使用START WITH来指定根节点,比如公司编码,然后通过CONNECT BY条件关联部门和小组。例如,部门是公司,小组的部门。 或者,先处理部门与小组的关系,再处理公司与部门的关系。可能需要将部门和小组连接起来,形成层次结构,然后进行汇总。 另一个思路是使用GROUPING函数和ROLLUP,根据部门编码和小组编码的匹配规则来生成层级汇总。不过这可能比较复杂,因为ROLLUP通常是基于列的顺序,而这里的层级需要特定的字符串匹配条件。 可能需要先为每个部门生成一个虚拟的节点(公司),然后为每个小组生成节点(部门)。然后通过层次查询汇总。 或者,先为每个小组到对应的部门编码,再为每个部门到对应的公司编码,然后使用层级聚合函数,比如SUM(...) OVER (PARTITION BY ...) 或者使用递归CTE来累加。 可能需要先创建三个层级的节点:公司、部门、小组,然后将员工数据分配到对应的节点,再进行汇总。例如: - 公司节点:公司编码60899000,节点为NULL - 部门节点:部门编码,节点为公司编码 - 小组节点:小组编码,节点为对应的部门编码 然后通过CONNECT BY PRIOR来连接节点和节点,使用SUM函数在层次结构中累加数据。 但是具体的实现可能需要将部门编码和小组编码转换为对应的层级关系,可能需要使用字符串函数处理编码,然后建立层级关系。 例如,部门的编码可能是像60899XXX000这样的格式,中间三位代部门号,而小组编码的前三位是部门号,后面可能有其他数字。需要从中提取部门号和小组号。 假设有一个employee,字段包括dept_code部门编码)、team_code(小组编码)、num_people(人数)、salary(工资)、fund(团建资金)。 首先,需要将部门编码的中间三位提取出来作为dept_part,使用SUBSTR(dept_code,4,3)(假设部门编码是类似60899000,中间三位从第4位开始)。然后,小组编码的前三位是team_part,使用SUBSTR(team_code,1,3)。如果dept_part等于team_part,那么这个小组属于该部门。 但是如何建立层级呢?可能需要将部门和小组合并到一个层级结构中,每个部门作为公司(60899000)的节点,每个小组作为对应部门节点。 例如,创建一个包含所有节点(公司、部门、小组)的临时,然后通过CONNECT BY建立层级关系。 步骤可能如下: 1. 创建公司节点:code=60899000,parent_code=NULL 2. 创建部门节点:code=dept_code,parent_code=60899000 3. 创建小组节点:code=team_code,parent_code=对应的部门编码(通过提取小组编码前三位匹配部门编码中间三位) 4. 将员工数据关联到对应的节点(小组) 5. 使用CONNECT BY PRIOR进行层级汇总 或者,使用WITH句来生成层级结构: WITH hierarchy AS ( SELECT dept_code AS node_code, 'DEPT' AS node_type, '60899000' AS parent_code FROM departments UNION ALL SELECT team_code AS node_code, 'TEAM' AS node_type, dept_code AS parent_code FROM teams WHERE SUBSTR(team_code, 1, 3) = SUBSTR(dept_code, 4, 3) ) ... 不过这可能比较复杂,因为需要从现有中获取部门和小组的关系。或者假设部门和小组的信息都在同一个中,比如每个员工记录都有dept_code和team_code,那么可能需要先确定部门和小组的层级关系。 另一个方法是使用CONNECT BY条件来直接建立层级: SELECT CASE LEVEL WHEN 1 THEN 'COMPANY' WHEN 2 THEN 'DEPT' WHEN 3 THEN 'TEAM' END AS level_type, ... FROM employee CONNECT BY ... 但是可能需要更具体的关联条件。例如,公司是根节点,部门是第二层,小组是第三层。每个部门节点是公司,每个小组的节点是部门。 具体来说,可以使用伪列来构建层级: SELECT '60899000' AS company_code, dept_code, team_code, ... FROM employee START WITH dept_code = '60899000' CONNECT BY PRIOR dept_code = ... ? 这可能不太对,因为部门编码和小组编码的关系需要通过字符串提取来关联。可能需要使用SUBSTR函数来连接。 例如,对于部门节点是公司,而对于小组,节点是部门,其部门编码的中间三位等于小组编码的前三位。 所以,层次查询的条件可能类似于: START WITH dept_code = '60899000' -- 公司节点 CONNECT BY PRIOR dept_code = (部门编码的是公司) 然后对于小组,连接到部门: 可能需要将部门和小组合并到一个节点列中,然后使用CONNECT BY条件。比如: WITH all_nodes AS ( SELECT dept_code AS code, 'DEPT' AS type, '60899000' AS parent_code FROM (SELECT DISTINCT dept_code FROM employee) UNION ALL SELECT team_code AS code, 'TEAM' AS type, (SELECT dept_code FROM employee e2 WHERE SUBSTR(e2.dept_code,4,3) = SUBSTR(team_code,1,3) AND ROWNUM=1) AS parent_code FROM (SELECT DISTINCT team_code FROM employee) ) SELECT code, parent_code, type FROM all_nodes CONNECT BY PRIOR code = parent_code START WITH parent_code = '60899000'; 这可能会有问题,因为查询可能无法在CONNECT BY中使用,或者效率很低。但这是一个思路。 一旦层级结构建立起来,就可以使用SYS_CONNECT_BY_PATH来获取路径,然后进行汇总。或者,在层次查询的基础上,使用聚合函数。 另一个方法是使用递归CTE来构建层级: WITH hierarchy (node_code, parent_code, level_type) AS ( -- 根节点:公司 SELECT '60899000', NULL, 'COMPANY' FROM DUAL UNION ALL -- 部门节点 SELECT dept_code, '60899000', 'DEPT' FROM employee WHERE dept_code LIKE '608%' -- 假设部门编码以608开头 GROUP BY dept_code UNION ALL -- 小组节点 SELECT team_code, (SELECT dept_code FROM employee e2 WHERE SUBSTR(e2.dept_code,4,3) = SUBSTR(team_code,1,3) AND ROWNUM=1), 'TEAM' FROM employee GROUP BY team_code ) SELECT * FROM hierarchy; 这可能会有问题,特别是查询中的关联,但可以尝试。 然后,使用这个hierarchy CTE来连接员工数据,并计算各层的汇总。 不过,可能更简单的方法是直接通过GROUP BY和字符串函数来处理。例如: 首先,将每个员工的记录分配到对应的部门,通过小组编码的前三位匹配部门编码的中间三位。然后,对部门和公司进行汇总。 例如: SELECT COALESCE(dept_code, '60899000') AS dept_code, SUM(num_people) AS total_people, SUM(salary) AS total_salary, SUM(fund) AS total_fund FROM ( -- 小组级别的汇总 SELECT (SELECT dept_code FROM departments d WHERE SUBSTR(d.dept_code,4,3) = SUBSTR(e.team_code,1,3)) AS dept_code, SUM(e.num_people) AS num_people, SUM(e.salary) AS salary, SUM(e.fund) AS fund FROM employee e GROUP BY team_code ) GROUP BY ROLLUP(dept_code) 这样,首先在查询中根据小组到对应的部门,然后汇总到部门,再通过ROLLUP汇总到公司。不过假设有一个departments,存储部门编码,或者需要从employee中获取唯一的部门编码,这时候可能需要使用查询来关联。 或者,直接从employee中提取部门编码: SELECT SUBSTR(team_code,1,3) AS dept_part, dept_code FROM employee WHERE SUBSTR(dept_code,4,3) = SUBSTR(team_code,1,3) 这可能有问题,因为同一个小组可能属于多个部门?不过根据用户的需求,应该是每个小组的前三位对应一个部门的中间三位,所以每个小组属于一个部门。 如果employee中的每个记录都有dept_code和team_code,那么可以直接通过team_code的前三位到对应的部门编码: SELECT DISTINCT team_code, (SELECT dept_code FROM employee e2 WHERE SUBSTR(e2.dept_code,4,3) = SUBSTR(e1.team_code,1,3) AND ROWNUM=1) AS dept_code FROM employee e1 但这可能效率不高,而且需要确保每个小组对应的部门存在。或者,假设每个小组的team_code前三位唯一对应一个部门编码的中间三位,那么可以这样做。 然后,在汇总时,首先在小组级别汇总,然后按照部门汇总,最后汇总到公司。 例如: WITH team_summary AS ( SELECT team_code, SUBSTR(team_code,1,3) AS dept_part, SUM(num_people) AS num_people, SUM(salary) AS salary, SUM(fund) AS fund FROM employee GROUP BY team_code ), dept_mapping AS ( SELECT DISTINCT dept_code, SUBSTR(dept_code,4,3) AS dept_part FROM employee ), team_dept AS ( SELECT t.team_code, d.dept_code FROM team_summary t JOIN dept_mapping d ON t.dept_part = d.dept_part ), grouped_data AS ( SELECT d.dept_code, t.num_people, t.salary, t.fund FROM team_dept td JOIN team_summary t ON td.team_code = t.team_code UNION ALL SELECT dept_code, SUM(num_people), SUM(salary), SUM(fund) FROM team_dept td JOIN team_summary t ON td.team_code = t.team_code GROUP BY dept_code UNION ALL SELECT '60899000' AS dept_code, SUM(num_people), SUM(salary), SUM(fund) FROM team_summary ) SELECT dept_code, SUM(num_people), SUM(salary), SUM(fund) FROM grouped_data GROUP BY dept_code; 不过这可能比较复杂,而且存在重复计算。或者更简单的办法是使用ROLLUP,但需要正确的层级结构。 另一种方法是使用GROUPING SETS: SELECT CASE WHEN GROUPING(dept_code) = 1 THEN '60899000' ELSE dept_code END AS dept_code, SUM(num_people) AS total_people, SUM(salary) AS total_salary, SUM(fund) AS total_fund FROM ( SELECT d.dept_code, e.num_people, e.salary, e.fund FROM employee e JOIN dept_mapping d ON SUBSTR(e.team_code,1,3) = d.dept_part ) GROUP BY GROUPING SETS ((dept_code), ()); 这里的查询将每个员工记录关联到对应的部门编码,然后GROUPING SETS生成部门和公司级别的汇总。这可能更有效。 不过,用户可能需要每个层级的汇总,包括部门和小组成员的,但问题描述中提到需要“逐层汇总,最终生成包含部门编号、总人数、总工资、总团建资金的结果”,可能只需要部门和公司级别,而不需要小组级别的结果?或者需要所有层级? 问题中提到“根据部门编码与小组编码的层级关系(公司-部门-小组)”,所以可能需要三个层级的汇总。但用户可能只需要部门级别和公司级别的汇总? 根据用户的问题,最终结果需要包含部门编号,所以可能只到部门级别,但公司也需要汇总。或者,结果包括公司、部门、小组的编号,但用户说“部门编号”,可能是指各个部门的汇总,加上公司的汇总。 可能用户需要的结果是每个部门(包括公司作为顶级部门)的汇总数据。例如: 部门编号 | 总人数 | 总工资 | 总团建资金 60899000 | ... | ... | ... 部门A | ... | ... | ... 部门B | ... | ... | ... 因此,需要将公司作为最高层级,部门作为下一层,然后汇总各层的数据。这可能通过层次查询和聚合函数实现。 总结可能的步骤: 1. 确定每个小组所属的部门,通过小组编码前三位匹配部门编码中间三位。 2. 将员工数据按小组和部门进行汇总。 3. 使用层次查询递归CTE建立公司-部门-小组的层级结构。 4. 使用聚合函数计算每个节点的汇总值,包括所有节点的总和。 例如,使用Oracle的CONNECT BY和START WITH进行层次查询,然后使用SUM和GROUP BY进行汇总。或者使用递归CTE来遍历层级,并累加值。 可能的SQL查询结构如下: WITH dept_team_hierarchy AS ( SELECT dept_code AS node_id, 'DEPT' AS node_type, '60899000' AS parent_id FROM ( SELECT DISTINCT dept_code FROM employee WHERE LENGTH(dept_code) >= 6 ) UNION ALL SELECT team_code AS node_id, 'TEAM' AS node_type, dept_code AS parent_id FROM ( SELECT DISTINCT e.team_code, d.dept_code FROM employee e JOIN ( SELECT dept_code, SUBSTR(dept_code, 4, 3) AS dept_part FROM employee GROUP BY dept_code ) d ON SUBSTR(e.team_code, 1, 3) = d.dept_part ) ), company AS ( SELECT '60899000' AS node_id, NULL AS parent_id FROM DUAL ), full_hierarchy AS ( SELECT node_id, parent_id FROM company UNION ALL SELECT node_id, parent_id FROM dept_team_hierarchy ), employee_aggregation AS ( SELECT COALESCE(d.dept_code, e.team_code) AS node_id, SUM(e.num_people) AS num_people, SUM(e.salary) AS salary, SUM(e.fund) AS fund FROM employee e LEFT JOIN ( SELECT DISTINCT dept_code, SUBSTR(dept_code,4,3) AS dept_part FROM employee ) d ON SUBSTR(e.team_code,1,3) = d.dept_part GROUP BY ROLLUP(d.dept_code, e.team_code) HAVING d.dept_code IS NOT NULL OR e.team_code IS NULL ) SELECT f.node_id AS department_code, SUM(e.num_people) AS total_people, SUM(e.salary) AS total_salary, SUM(e.fund) AS total_fund FROM full_hierarchy f JOIN employee_aggregation e ON f.node_id = e.node_id GROUP BY f.node_id; 不过这可能存在错误,需要进一步调整。例如,employee_aggregation中的ROLLUP可能需要正确分组,而full_hierarchy需要正确建立层级关系。 另一个可能的解决方案是使用Oracle的CONNECT BY和聚合函数结合: SELECT CASE WHEN LEVEL = 1 THEN '60899000' WHEN LEVEL = 2 THEN dept_code ELSE team_code END AS node_code, SUM(num_people) AS total_people, SUM(salary) AS total_salary, SUM(fund) AS total_fund FROM ( SELECT dept_code, team_code, num_people, salary, fund, SUBSTR(dept_code,4,3) AS dept_part, SUBSTR(team_code,1,3) AS team_part FROM employee ) WHERE CONNECT_BY_ISLEAF = 1 START WITH dept_code = '60899000' CONNECT BY PRIOR dept_part = team_part GROUP BY ROLLUP(node_code); 这可能不正确,因为CONNECT BY的条件可能需要调整。可能需要使用层级查询来连接部门和小组,然后在每个层级上进行聚合。 可能需要更仔细地构建层级结构,例如: SELECT LPAD(' ', 2*(LEVEL-1)) || node_code AS hierarchy, node_code, parent_code, total_people, total_salary, total_fund FROM ( SELECT '60899000' AS node_code, CAST(NULL AS VARCHAR2(20)) AS parent_code FROM DUAL UNION ALL SELECT dept_code AS node_code, '60899000' AS parent_code FROM ( SELECT DISTINCT dept_code FROM employee ) UNION ALL SELECT team_code AS node_code, dept_code AS parent_code FROM ( SELECT DISTINCT e.team_code, d.dept_code FROM employee e JOIN ( SELECT dept_code, SUBSTR(dept_code,4,3) AS dept_part FROM employee ) d ON SUBSTR(e.team_code,1,3) = d.dept_part ) ) t LEFT JOIN ( SELECT node_code, SUM(num_people) AS total_people, SUM(salary) AS total_salary, SUM(fund) AS total_fund FROM ( SELECT team_code AS node_code, num_people, salary, fund FROM employee UNION ALL SELECT dept_code AS node_code, SUM(num_people) AS num_people, SUM(salary) AS salary, SUM(fund) AS fund FROM employee GROUP BY dept_code UNION ALL SELECT '60899000' AS node_code, SUM(num_people) AS num_people, SUM(salary) AS salary, SUM(fund) AS fund FROM employee ) GROUP BY node_code ) agg ON t.node_code = agg.node_code CONNECT BY PRIOR node_code = parent_code START WITH parent_code IS NULL; 不过这可能仍然存在错误,并且性能可能不佳,特别是对于大数据量。 总结来说,正确的步骤可能包括: 1. 确定每个小组对应的部门编码。 2. 使用层次查询构建公司-部门-小组的结构。 3. 在层次查询的基础上,使用聚合函数计算每个节点的汇总值,包括所有节点的总和。 最终的SQL可能需要使用递归CTE来逐层汇总: WITH hierarchy (node_id, parent_id, node_type) AS ( SELECT '60899000' AS node_id, NULL AS parent_id, 'COMPANY' AS node_type FROM DUAL UNION ALL SELECT dept_code AS node_id, '60899000' AS parent_id, 'DEPT' AS node_type FROM ( SELECT DISTINCT dept_code FROM employee ) UNION ALL SELECT team_code AS node_id, dept_code AS parent_id, 'TEAM' AS node_type FROM ( SELECT DISTINCT e.team_code, d.dept_code FROM employee e JOIN ( SELECT dept_code, SUBSTR(dept_code,4,3) AS dept_part FROM employee GROUP BY dept_code ) d ON SUBSTR(e.team_code,1,3) = d.dept_part ) ), employee_agg AS ( SELECT COALESCE(d.dept_code, e.team_code) AS node_id, SUM(e.num_people) AS num_people, SUM(e.salary) AS salary, SUM(e.fund) AS fund FROM employee e LEFT JOIN ( SELECT dept_code, SUBSTR(dept_code,4,3) AS dept_part FROM employee GROUP BY dept_code ) d ON SUBSTR(e.team_code,1,3) = d.dept_part GROUP BY ROLLUP(d.dept_code, e.team_code) HAVING d.dept_code IS NOT NULL OR e.team_code IS NULL ) SELECT h.node_id AS department_code, SUM(e.num_people) AS total_people, SUM(e.salary) AS total_salary, SUM(e.fund) AS total_fund FROM hierarchy h LEFT JOIN employee_agg e ON h.node_id = e.node_id WHERE h.node_type IN ('COMPANY', 'DEPT') GROUP BY h.node_id; 不过,这可能仍然需要调试和优化。最终的正确查询可能需要多次尝试和测试,特别是在处理层级关系和聚合时。 综上所述,用户需要的关键点是根据部门编码和小组编码的特定匹配规则,使用层次查询递归CTE建立层级结构,然后进行逐层汇总。最终的SQL应该能够生成公司、部门层级的汇总数据,并正确关联各个层级。</think>### 分步解决方案 #### 1. 数据结构分析 假设存在员工信息`employee`,包含以下字段: - `team_code` VARCHAR2(20) -- 小组编码(前3位对应部门编码中间3位) - `dept_code` VARCHAR2(20) -- 部门编码(格式:608+3位部门号+000,如608001000) - `num_people` NUMBER -- 人数 - `salary` NUMBER -- 工资 - `fund` NUMBER -- 团建资金 #### 2. 层级关系建立 通过`SUBSTR`函数提取编码特征: - 部门标识:$ \text{SUBSTR(dept\_code, 4, 3)} $ - 小组所属部门标识:$ \text{SUBSTR(team\_code, 1, 3)} $ #### 3. 实现代码 ```sql WITH -- 步骤1:提取部门与小组的关联关系 dept_team AS ( SELECT dept_code, SUBSTR(dept_code, 4, 3) AS dept_part, team_code, num_people, salary, fund FROM employee ), -- 步骤2:构建层级关系(公司->部门->小组) hierarchy AS ( SELECT team_code AS node_code, dept_code AS parent_code, num_people, salary, fund FROM dept_team UNION ALL SELECT dept_code AS node_code, '60899000' AS parent_code, SUM(num_people) AS num_people, SUM(salary) AS salary, SUM(fund) AS fund FROM dept_team GROUP BY dept_code UNION ALL SELECT '60899000' AS node_code, NULL AS parent_code, SUM(num_people), SUM(salary), SUM(fund) FROM dept_team ) -- 步骤3:按层级聚合数据 SELECT node_code AS department_code, SUM(num_people) AS total_people, SUM(salary) AS total_salary, SUM(fund) AS total_fund FROM ( SELECT node_code, parent_code, num_people, salary, fund FROM hierarchy CONNECT BY PRIOR node_code = parent_code START WITH parent_code IS NULL ) WHERE node_code != '60899000' -- 排除公司自身重复计数 GROUP BY node_code ORDER BY LENGTH(node_code), node_code; ``` #### 4. 关键说明 1. **层级建立**: 通过`UNION ALL`分三层构建数据: - 小组级原始数据 - 部门级汇总数据($ \sum \text{小组数据} $) - 公司级总汇总($ \sum \text{部门数据} $) 2. **递归查询**: 使用`CONNECT BY`实现自顶向下遍历,通过`START WITH parent_code IS NULL`从公司节点开始展开层级。 3. **聚合计算**: 最终`GROUP BY`确保每个节点仅显示其直接管辖的汇总数据,避免重复计算[^1]。 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值