烧掉脑细胞......必须有一种简单的方法来做到这一点。
我继承了以下表格:
approval_path
approval_path_steps
applications
application_roles
requests
role_approvals
用户 requests
application role
application
,必须通过 approval path
,其步骤在 approval_path_steps
中定义。批准路径的每个步骤的批准历史记录存储在 role_approvals
中。所以:
approval_path:
-> (p)approval_path_id
|
-------------------------
|
approval_path_steps: |
(p)approval_path_id --|
--> (p)sequence_nbr |
| approver |
| |
| |
| applications: |
| -> (p)application_id |
| | approval_path_id --
| |
| -------------------------
| |
| application_roles: |
| -> (p)role_id |
| | application_id ---
| |
| -------------------------
| |
| requests: |
| -> (p)request_nbr |
| | role_id ---
| | requestor
| |
| -------------------------
| |
| role_approvals: |
| (p)request_nbr ---
---- (p)sequence_nbr (NOT ACTUALLY KEYED!!! ENTERED MANUALLY!!)
approver
status
其中(p)
表示主键。没有立即相关的字段已被省略。 (顺便说一下,这不是我的设计)
问题:对于给定的批准路径,审批路径步骤随时间而变化;已将步骤从一个批准者添加,删除或更改为另一个批准者。因此,实际为请求采用的 approval_path_steps
与当前为请求的角色的定义的 approval_path_steps
不匹配approval_path
的
我需要什么:我需要查询role_approvals
表,以便列出 使用的不同路径。所以:
role_approvals
--------------
1000 role1 1 manager approved
1000 role1 2 hr_mgr approved
1000 role1 3 app_owner approved
1001 role1 1 manager approved
1001 role1 2 hr_mgr approved
1001 role1 3 app_owner approved
1002 role1 1 app_owner approved
1002 role1 2 manager approved
我想要的结果:
id seq_nbr approver
-- ------- --------
1 1 manager
1 2 hr_mgr
1 3 app_owner
2 1 app_owner
2 2 manager
其中'id'可以通过某种识别方式计算,无论如何识别所采用的唯一批准路径。
有什么想法吗?
提前致谢! 詹姆斯
答案 0 :(得分:0)
这只是部分解决方案。可悲的是,当我尝试在此基础上将其转换回原始格式时,我收到了ORA-600错误。但至少它会给你带来不同的路径。
基本上,您似乎需要按请求编号聚合批准者文本字段,并查找聚合的不同值。 XML函数是Oracle 10g中唯一知道的(内置)文本聚合方法。
select
distinct xmlserialize(CONTENT approver_path AS VARCHAR2(2000)) distinct_path
from (
select
request_nbr,
xmlagg(xmlelement("Approver",approver) order by sequence_nbr) approver_path
from
role_approvals
group by
request_nbr
)