加入四个 SQL 表
Joining Four SQL Tables
我有四个 tables,如下所示,在 oracle 数据库中,员工列表与办公室 ID 映射(m_office 包含办公室 ID 和办公室名称)。所有办公室都是分部或分部。同样,所有细分都属于分部。我需要找出部门明智的员工人数(部门人数也应包括属于细分部门的员工),如最后 table.
所示
(因为它是一个工作数据库所以不能改变结构)。无法找到解决方案。非常感谢任何帮助。提前致谢。
TEST_EMPLOYEELIST
EmpId EmpName Office_id
--------------------------------
1 Alex O1
2 John O1
3 Bob O3
4 Max O5
5 Nick O5
6 Jack O1
7 Paul O2
TEST_M_OFFICE
office_id office_name
------------------------------
O1 Kamrup Division
O2 Nalbari Division
O3 Barpeta Division
O4 Nalbari RR Subdivision
O5 Barpeta SR Subdivision
O6 Barpeta RR Subdivision
TEST_DIVISION
division_id division_name
-----------------------------------
D1 Kamrup Division
D2 Nalbari Division
D3 Barpeta Division
D4 Bongaigon Division
D5 Rangia Division
TEST_DIV_SUBDIV_MAPPING
subdivision_id subdivision_name division_id
------------------------------------------------------
S1 Nalbari RR Subdivision D2
S2 Barpeta SR Subdivision D3
S3 Barpeta RR Subdivision D3
S4 Rangia RR Subdivision D5
S5 Kamrup RR Subdivision D1
需要:Division_wise条记录(包括细分数)
division_name count
----------------------------
Kamrup Division 3
Nalbari Division 1
Barpeta Division 3
Bongaigon Division 0
Rangia Division 0
这是我目前尝试过的方法:
select b.office_name,
count(*)
from test_employeelist a,
test_m_office b
where a.officeid = b.office_id
group by b.office_name;
试试这个。
SELECT division_name,
count(*)
FROM
(SELECT b.office_name division_name
FROM test_employeelist a,
test_m_office b,
TEST_DIVISION c
WHERE a.office_id=b.office_id
AND b.office_name=c.division_name
UNION ALL
SELECT c.division_name division_name
FROM test_employeelist a,
test_m_office b,
TEST_DIVISION c,
TEST_DIV_SUBDIV_MAPPING d
WHERE a.office_id=b.office_id
AND b.office_name = d.subdivision_name
AND c.division_id = d.division_id )
GROUP BY division_name;
这是一个非常糟糕的数据模型。由于无法在名称上创建外键,一个简单的拼写错误会导致记录不相关。
但是,您的办公室是部门,办公室是部门的分支机构。使用 UNION ALL 将两者结合起来得到中间 table 相关办公室和部门。
select
dv.division_name,
count(e.empid) as employee_count
from
(
select d.division_id, d.division_name, d.division_name as office_name
from test_division d
union all
select d.division_id, d.division_name, sd.subdivision_name as office_name
from test_div_subdiv_mapping sd
join test_division d on d.division_name = sd.division_id
) dv
join test_m_office o on o.office_name = dv.office_name
left join test_employeelist e on e.office_id = o.office_id
group by dv.division_id, dv.division_name;
我有四个 tables,如下所示,在 oracle 数据库中,员工列表与办公室 ID 映射(m_office 包含办公室 ID 和办公室名称)。所有办公室都是分部或分部。同样,所有细分都属于分部。我需要找出部门明智的员工人数(部门人数也应包括属于细分部门的员工),如最后 table.
所示(因为它是一个工作数据库所以不能改变结构)。无法找到解决方案。非常感谢任何帮助。提前致谢。
TEST_EMPLOYEELIST
EmpId EmpName Office_id
--------------------------------
1 Alex O1
2 John O1
3 Bob O3
4 Max O5
5 Nick O5
6 Jack O1
7 Paul O2
TEST_M_OFFICE
office_id office_name
------------------------------
O1 Kamrup Division
O2 Nalbari Division
O3 Barpeta Division
O4 Nalbari RR Subdivision
O5 Barpeta SR Subdivision
O6 Barpeta RR Subdivision
TEST_DIVISION
division_id division_name
-----------------------------------
D1 Kamrup Division
D2 Nalbari Division
D3 Barpeta Division
D4 Bongaigon Division
D5 Rangia Division
TEST_DIV_SUBDIV_MAPPING
subdivision_id subdivision_name division_id
------------------------------------------------------
S1 Nalbari RR Subdivision D2
S2 Barpeta SR Subdivision D3
S3 Barpeta RR Subdivision D3
S4 Rangia RR Subdivision D5
S5 Kamrup RR Subdivision D1
需要:Division_wise条记录(包括细分数)
division_name count
----------------------------
Kamrup Division 3
Nalbari Division 1
Barpeta Division 3
Bongaigon Division 0
Rangia Division 0
这是我目前尝试过的方法:
select b.office_name,
count(*)
from test_employeelist a,
test_m_office b
where a.officeid = b.office_id
group by b.office_name;
试试这个。
SELECT division_name,
count(*)
FROM
(SELECT b.office_name division_name
FROM test_employeelist a,
test_m_office b,
TEST_DIVISION c
WHERE a.office_id=b.office_id
AND b.office_name=c.division_name
UNION ALL
SELECT c.division_name division_name
FROM test_employeelist a,
test_m_office b,
TEST_DIVISION c,
TEST_DIV_SUBDIV_MAPPING d
WHERE a.office_id=b.office_id
AND b.office_name = d.subdivision_name
AND c.division_id = d.division_id )
GROUP BY division_name;
这是一个非常糟糕的数据模型。由于无法在名称上创建外键,一个简单的拼写错误会导致记录不相关。
但是,您的办公室是部门,办公室是部门的分支机构。使用 UNION ALL 将两者结合起来得到中间 table 相关办公室和部门。
select
dv.division_name,
count(e.empid) as employee_count
from
(
select d.division_id, d.division_name, d.division_name as office_name
from test_division d
union all
select d.division_id, d.division_name, sd.subdivision_name as office_name
from test_div_subdiv_mapping sd
join test_division d on d.division_name = sd.division_id
) dv
join test_m_office o on o.office_name = dv.office_name
left join test_employeelist e on e.office_id = o.office_id
group by dv.division_id, dv.division_name;