2010-10-08 77 views
1

燃燒出一個大腦細胞...必須有一個簡單的方法來做到這一點。Oracle查詢提取不同的路線

我繼承下表:

approval_path 
approval_path_steps 
applications 
application_roles 
requests 
role_approvals 

用戶requestsapplication roleapplication,必須經歷一個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 

其中 '身份證' 可以在一些確定的方式來計算,它並不怎麼回事,以確定採取了獨特的審批路徑。

任何想法?

在此先感謝! James

回答

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 
) 
+0

這個查詢整個上午變暗了燈光(沒有意外)。要試着讓它在一夜之間運行,看看我回來了什麼,我會盡快回復你。謝謝! – 2010-10-11 20:58:16

+0

我一直無法成功完成這個查詢......大部分我已經能夠讓它運行14個小時,但是當我早晨收拾我的筆記本電腦時,我不得不殺掉它。將其標記爲正確的答案,假設它將使用較小的一組數據。謝謝您的幫助! – 2010-10-13 14:28:54