找出部门表所有层次关系
有一张部门表

我现在要找出这张表所有的关系,怎么写?查出来结果类似如下:
id 部门1 部门2 部门3
3 佛山禅城理财营业部 团队A 团队A1
2 null 团队A 团队A1
1 null null 团队A1
其实我要做的就是找出所有关系,部门之间的依赖关系如下:部门1——>部门2——>部门3。
本来想用递归查询,但递归每次只能取出一条关系链,没有办法取出所有关系链。
下面是只能查出一条关系链的递归查询:
select max(decode(s.dept_type, '01', s.dept_name, '')) "部门1",
max(decode(s.dept_type, '02', s.dept_name, '')) "部门2",
max(decode(s.dept_type, '03', s.dept_name, '')) "部门3"
from bao_t_dept_info s
start with s.dept_type = '03'
connect by s.id = prior s.parent_id;
在网上看见有网友用一种比较笨的方法是穷尽所有部门,如:
WITH B1 AS(
SELECT 部门名称,部门名称 一级部门,'' 二级部门,'' 三级部门,'' 四级部门,'' 五级部门 FROM 部门表 WHERE 层级=0),
B2 AS(
SELECT B.部门名称,B1.一级部门,B.部门名称 二级部门,'' 三级部门,'' 四级部门,'' 五级部门 FROM B1 JOIN 部门表 B ON B.上级部门ID=B1.部门名称 WHERE B.层级=1),
B3 AS(
SELECT B.部门名称,B2.一级部门,B2.二级部门,B.部门名称 三级部门,'' 四级部门,'' 五级部门 FROM B2 JOIN 部门表 B ON B.上级部门ID=B2.部门名称 WHERE B.层级=2),
B4 AS(
SELECT B.部门名称,B3.一级部门,B3.二级部门,B3.三级部门,B.部门名称 四级部门,'' 五级部门 FROM B3 JOIN 部门表 B ON B.上级部门ID=B3.部门名称 WHERE B.层级=3),
B5 AS(
SELECT B.部门名称,B4.一级部门,B4.二级部门,B4.三级部门,B4.四级部门,B.部门名称 五级部门 FROM B4 JOIN 部门表 B ON B.上级部门ID=B4.部门名称 WHERE B.层级=4),
B AS(
SELECT * FROM B1
UNION ALL
SELECT * FROM B2
UNION ALL
SELECT * FROM B3
UNION ALL
SELECT * FROM B4
UNION ALL
SELECT * FROM B5)
SELECT ID,姓名,一级部门,二级部门,三级部门,四级部门,五级部门 FROM B JOIN 员工表 Y ON Y.部门=B.部门名称;
这张方法在部门固定的时候还可以这么弄,如果部门不固定,或者有几十上百个部门的话,这张方法肯定不行。不知道大家有没有什么高招?

我现在要找出这张表所有的关系,怎么写?查出来结果类似如下:
id 部门1 部门2 部门3
3 佛山禅城理财营业部 团队A 团队A1
2 null 团队A 团队A1
1 null null 团队A1
其实我要做的就是找出所有关系,部门之间的依赖关系如下:部门1——>部门2——>部门3。
本来想用递归查询,但递归每次只能取出一条关系链,没有办法取出所有关系链。
下面是只能查出一条关系链的递归查询:
select max(decode(s.dept_type, '01', s.dept_name, '')) "部门1",
max(decode(s.dept_type, '02', s.dept_name, '')) "部门2",
max(decode(s.dept_type, '03', s.dept_name, '')) "部门3"
from bao_t_dept_info s
start with s.dept_type = '03'
connect by s.id = prior s.parent_id;
在网上看见有网友用一种比较笨的方法是穷尽所有部门,如:
WITH B1 AS(
SELECT 部门名称,部门名称 一级部门,'' 二级部门,'' 三级部门,'' 四级部门,'' 五级部门 FROM 部门表 WHERE 层级=0),
B2 AS(
SELECT B.部门名称,B1.一级部门,B.部门名称 二级部门,'' 三级部门,'' 四级部门,'' 五级部门 FROM B1 JOIN 部门表 B ON B.上级部门ID=B1.部门名称 WHERE B.层级=1),
B3 AS(
SELECT B.部门名称,B2.一级部门,B2.二级部门,B.部门名称 三级部门,'' 四级部门,'' 五级部门 FROM B2 JOIN 部门表 B ON B.上级部门ID=B2.部门名称 WHERE B.层级=2),
B4 AS(
SELECT B.部门名称,B3.一级部门,B3.二级部门,B3.三级部门,B.部门名称 四级部门,'' 五级部门 FROM B3 JOIN 部门表 B ON B.上级部门ID=B3.部门名称 WHERE B.层级=3),
B5 AS(
SELECT B.部门名称,B4.一级部门,B4.二级部门,B4.三级部门,B4.四级部门,B.部门名称 五级部门 FROM B4 JOIN 部门表 B ON B.上级部门ID=B4.部门名称 WHERE B.层级=4),
B AS(
SELECT * FROM B1
UNION ALL
SELECT * FROM B2
UNION ALL
SELECT * FROM B3
UNION ALL
SELECT * FROM B4
UNION ALL
SELECT * FROM B5)
SELECT ID,姓名,一级部门,二级部门,三级部门,四级部门,五级部门 FROM B JOIN 员工表 Y ON Y.部门=B.部门名称;
这张方法在部门固定的时候还可以这么弄,如果部门不固定,或者有几十上百个部门的话,这张方法肯定不行。不知道大家有没有什么高招?
...全文
相关推荐
sql多表查询
例如,使用INNER JOIN可以找出员工与其所在部门的关系。2. **自连接**:当一个表自身进行连接时,称为自连接。这在处理层次结构数据,如员工的上下级关系时特别有用。3.
SQL进阶技巧:字节最新面试题-每个HR负责的部门的人数之和 | 层次查询父子关系问题
核心思想:根据上图 就是把具有连接关系的子节点或叶子节点裁剪掉,如下图,把3,4节点干掉即可。步骤4:将存在包含关系的emp_cnt值去掉,置为0。步骤2:关联hrd表和dep表形成明细表。步骤5:形成最终结果。问题分析:梳理本题的关系如下图所示。步骤3:关联维度表和数据明细表。
部门组织数据库设计.pdf
这个设计是为了解决无限层级的部门结构问题。通过祖先节点ID,可以快速追溯部门的完整上下级关系。
5922.2021年高精度数字测温仪表行业营销部门表格模板汇总 .pdf
在2021年的高精度数字测温仪表行业中,营销部门的工作显得尤为重要,因为它涉及到产品的推广、销售策略的制定以及客户关系的维护。
sqlserver父子层次查询.pdf
`Port_Dept`表中的部门联接,找出所有子节点。


