当给定记录的级别是随机的时选择最高关联

Posted

技术标签:

【中文标题】当给定记录的级别是随机的时选择最高关联【英文标题】:Select highest association when given record's level is random 【发布时间】:2015-03-14 05:45:05 【问题描述】:

涉及三个表。 DBMS 是 Oracle 10g。

员工 = 个人员工记录

Emp_id (PK) 员工姓名 各种详细信息字段

部门 = 包含分层组织结构

部门代码 (PK) 部门名称 Parent_id(指父部门同表中的部门代码) depth_level(1 = ***别,2 = 1 的子部门,等等...最大值 = 6) 各种详细信息字段

关联 = 将员工映射到部门

Assoc_id (pk) emp_id (fk) dept_code (fk) 与不同关联类型相关的其他字段

在关联将员工映射到不同深度的部门时,我想运行一个查询,计算深度 = 2 分组的所有员工。如果员工在级别 6 的部门工作,我需要解决级别 5,然后4级,然后3级才能升到2级,但是如果他们在3级的部门工作,我只需要解决到2级。

试图找出最有效的方法。到目前为止,我正在考虑运行 5 个单独的查询,每个深度一个具有不同数量的子查询来解决深度级别,然后与联合。我的第二个想法是创建一个静态引用表,将每个部门代码映射到 2 级标签,但维护该表会出现问题。

有人有更好的想法吗?

【问题讨论】:

看来你需要一些hierarchical query。你能附上一些代码,我们知道你在做什么吗?和期望的输出?您的问题标题和这部分:“我想运行一个统计所有员工的查询” 有点令人困惑。任何细节都很有价值。 我明白你的意思,我的意思是我希望能够在***别对记录进行分组,无论是计算员工人数还是列出他们,重点是在给定级别汇总它们。我刚刚使用递归 CTE 解决了这个问题,这正是我想要的。 【参考方案1】:

递归 CTE 拯救了这一天。如果我的问题不清楚,我深表歉意,尽管我可能已经更改了原始帖子中的一些字段名称,但这是我的解决方案。我计划将联合查询第一部分中 U.ID 的静态值替换为一个参数,该参数将任何部门代码并检索其各自的下属部门。

在本例中,部门代码“5000002”是 IT 部门,结果显示 IT 部门层次结构中各个级别的所有员工。

select r.full_name, r.id, u.dept_name, u.dept_id, u.dept_level
from clarity.srm_resources r,
clarity.PRJ_OBS_ASSOCIATIONS a,
(with DIRECT_DEPT (Parent_ID, Dept_ID, Dept_Name, Dept_Level)
as
(
SELECT U.PARENT_ID, U.ID AS DEPT_ID, U.NAME AS DEPT_NAME, 0 AS Dept_Level
FROM  clarity.prj_obs_units u
where u.type_id = '5000001'
AND U.ID = '5000002'
UNION ALL
SELECT U.PARENT_ID, U.ID AS DEPT_ID, U.NAME AS DEPT_NAME, Dept_Level +1
FROM  clarity.prj_obs_units u
INNER JOIN DIRECT_DEPT D
ON U.PARENT_ID = D.DEPT_ID
where u.type_id = '5000001'
)
SELECT Parent_ID, Dept_ID, Dept_Name, Dept_Level
FROM DIRECT_DEPT) u
where a.record_id = r.id
and a.unit_id = u.dept_id
and a.table_name ='SRM_RESOURCES'
and r.is_active = '1'
;

【讨论】:

以上是关于当给定记录的级别是随机的时选择最高关联的主要内容,如果未能解决你的问题,请参考以下文章

个人项目1:一个能生成小学二年级四则运算题目的“软件”

生成具有给定元素数量和错误级别的已定义 Min、Max、Mean 和 Stdev 的随机数数组

Loadrunner 中随机选取关联对象

使用javascript从关联数组中选择随机值? [复制]

sql 一对多关系随机查一条

互信息(Mutual Information)的介绍