2014-05-25 4 views
1

Désolé si mon titre n'est pas correct car je ne sais pas comment expliquer ma situation. Je viens de démarrer une nouvelle application web qui a un workflow. J'ai une table pour stocker mon statut de flux de travail.Obtenir le niveau de la hiérarchie en utilisant T-SQL

WorkflowStatus Table

Id | Name 
---|------------ 
1 | Submitted 
2 | Accepted 
3 | Not Accepted 
4 | Returned for Re-Submission 
5 | Processed 
6 | Returned for Re-Acceptance 
7 | Completed 

et moi avons une autre table pour stocker toute navigation possible pour chacun des statuts.

WorkflowNavigation Table

WorkflowStatusId | NextWorkflowStatusId 
------------------|------------------------ 
1     | 2 
1     | 3 
1     | 4 
2     | 5 
2     | 6 
5     | 7 
4     | 1 
6     | 2 
6     | 3 
6     | 4 

Maintenant, je suis coincé sur la façon d'obtenir le niveau hiérarchique du flux de travail. J'ai essayé de faire la jointure en utilisant avec la clause mais cela m'a donné une boucle infinie à cause du flux réversible. Je veux seulement interroger des informations comme ci-dessous de la table WorkflowNavigation (Fondamentalement, c'est la version propre de WorkflowNavigation c'est-à-dire sans le flux inverse).

WorkflowStatusId NextWorkflowStatusId 
1    -> 2 
2    -> 5 
5    -> 7 
1    -> 2 
2    -> 6 
6    -> 3 
6    -> 4 
1    -> 3 
1    -> 4 

Et puis je veux obtenir quelques informations comme ci-dessous de la requête ci-dessus.

WorkflowStatusId | Level 
------------------|------- 
1     | 1 
2     | 2 
3     | 2 
4     | 2 
5     | 3 
6     | 3 
7     | 4 

Quelqu'un peut-il m'aider sur la requête T-SQL. Merci!

Répondre

0

Vous souhaitez parcourir le graphique depuis le premier noeud. Votre graphique a des cycles, vous avez donc besoin d'un moyen de ne pas revoir les nœuds précédents. L'approche suivante utilise une chaîne pour stocker les nœuds déjà visités. La requête ressemble à quelque chose comme:

with g as (
     select wn.workflowstatusid, wn.WorkflowStatusId as nextws, 0 as lev, 
      ',' + cast(wn.WorkflowStatusId as varchar(max)) + ',' as wses 
     from workflownavigation wn 
     where workflowstatusid = 1 
     union all 
     select g.workflownavigation, wn.NextWorkflowStatusId, lev + 1, 
      ',' + cast(wn.NextWorkflowStatusId as varchar(max)) + g.wses 
     from g join 
      workflownavigation wn 
      on g.nextws = wn.NextWorkflowStatusId 
     where g.wses not like '%,' + cast(wn.NextWorkflowStatusId) + ',%' 
    ) 
select nextws, min(lev) 
from g 
group by nextws; 
Questions connexes