2010-10-08 11 views
1

Brûler une cellule cérébrale ... il doit y avoir un moyen simple de le faire.Requête Oracle pour extraire des itinéraires distincts

J'ai hérité les tableaux suivants:

approval_path 
approval_path_steps 
applications 
application_roles 
requests 
role_approvals 

Un utilisateur requests un application role pour un application, qui doit passer par un approval path, dont les étapes sont définies dans approval_path_steps. L'historique d'approbation pour chaque étape du chemin d'approbation est stocké dans role_approvals. Ainsi:

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) indique la clé primaire. Les champs non immédiatement pertinents ont été omis. (btw, ce n'était pas ma conception)

Le problème: Les étapes du chemin d'approbation ont changé avec le temps pour un chemin d'approbation donné; des étapes ont été ajoutées, supprimées ou modifiées d'un approbateur à l'autre. Par conséquent, le approval_path_steps qui ont été effectivement prises pour une demande ne correspond pas à la approval_path_steps qui sont actuellement définis pour approval_path du rôle demandé.

Ce que je besoin: J'ai besoin d'interroger la table role_approvals de telle sorte que je peux énumérer les chemins distincts qui ont été utilisés. Alors:

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 


Les résultats que je veux:

id seq_nbr approver 
-- ------- -------- 
1  1 manager 
1  2 hr_mgr 
1  3 app_owner 

2  1 app_owner 
2  2 manager 

où 'id' peut être calculée d'une certaine façon d'identifier, peu importe comment, d'identifier que chemin d'approbation unique qui a été pris.

Des idées?

Merci d'avance! James

Répondre

0

Ceci est seulement une solution partielle. Malheureusement, je reçois des erreurs ORA-600 lorsque j'essaie de construire sur cela pour le convertir dans le format original. Mais au moins, il vous obtiendra les chemins distincts. Fondamentalement, il semble que vous ayez besoin d'agréger le champ de texte d'approbateur par le numéro de requête, et de trouver des valeurs distinctes de l'agrégat. Les fonctions XML sont la seule méthode d'agrégation de texte (intégrée) que je connaisse dans 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

Cette requête a obscurci les lumières toute la matinée (pas de surprise). Je vais essayer de le laisser passer la nuit pour voir ce que je reçois, je reviendrai vers vous. Merci! –

+0

Je n'ai pas été en mesure d'obtenir cette requête pour terminer avec succès ... la plupart j'ai pu le laisser fonctionner est de 14 heures, mais j'ai dû le tuer quand j'ai emballé mon ordinateur portable le matin.Marquer comme la bonne réponse en supposant que cela fonctionnerait avec un plus petit ensemble de données. Merci pour l'aide! –