我的表格如下:
emp id | post | manager id
----------------------------
1 | l1 | 2
2 | l2 | 3
4 |l1 | 2
3 | l3 | null
-----------------------------
我还有另一张表:
emp id | target achived | given target |
----------------------------------------
1 | 200 | 300
---------------------------------------
4 | 400 | 500
我有一个发出通知的功能,比如
l1 id----target achived/target given
1,200 / 300 4,400 / 500
(上面提到的通知emp id 2将获得,谁是l2) 所有l2都会收到这样的通知。
l3只会获得l2的短信 对于给定的情况l2目标achived =所有目标由他的所有l1
获得所以emp id 3会变得像--------
empid 2--- 2, 600/800
如何设计查询是一种通用的方式,层次结构的深度可以是任何东西。实际工作仅由l1完成。 通知将像 - l2只会获得自己l1的结果。 l3将得到他自己的l2(相应的l1的结果的总和)和相应的l2 sms的结果......所以......
答案 0 :(得分:0)
在Oacle中,您有“已连接”来运行分层查询。
以下是AskTom关于此主题的链接。您还可以谷歌“Oracle Connected By”。
我没有安装Oracle,所以我无法测试它,但这是你可以通过经理获得实现/目标总数的方法:
获取经理的经理报告的分层结果。 获取每个经理的统计数据,就像他们是自己的老板一样,以便将信息包含在他们自己的报告中。 联盟两套信息。 并由经理总结信息。
同样,查询可能会出现拼写错误,但所提出的策略应该有效。
select sum(c_achieved), sum(c_target), c_manager
from
(
-- Get the metrics of each manager's reports
select all_info.t_achieved c_achieved, all_info.t_target c_target, all_info.manager c_manager
from
(select emp_id, post, manager, t_achieved, t_target
from emps, targets
where emps.emp_id = targets.emp_id) all_info
start with all_info.manager is null
connect by prior all_info.emp_id = all_info.manager
union
--Get the metrics of the managers to add them to themelves
select all_info2.t_achieved, all_info2.t_target, all_info2.emp_id
from
(select null, post, emp_id, t_achieved, t_target
from emps, targets
where emps.emp_id in (select distinct manager from emps) all_info_2
where all_info_2.emp_id = all_info_2.manager
) stats_by_manager
group by c_manager