Oracle запрос для извлечения различных маршрутов - PullRequest
1 голос
/ 08 октября 2010

Выжигание клетки мозга ... должен быть простой способ сделать это.

Я унаследовал следующие таблицы:

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 голосов
/ 09 октября 2010

Это только частичное решение.К сожалению, я получаю ошибки 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
)
...