Oracle查询提取不同的路由

时间:2010-10-08 19:04:13

标签: sql oracle aggregate-functions

烧掉脑细胞......必须有一种简单的方法来做到这一点。

我继承了以下表格:

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'可以通过某种识别方式计算,无论如何识别所采用的唯一批准路径。

有什么想法吗?

提前致谢! 詹姆斯

1 个答案:

答案 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
)