使用T-SQL获取层次结构级别

时间:2014-05-25 02:08:33

标签: sql workflow

很抱歉,如果我的标题不对,因为我不知道如何解释我的情况。我刚刚开始了一个新的Web应用程序,它上面有一个工作流程。我有一个表来存储我的工作流程状态。

WorkflowStatus

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

我还有另一张表来存储每种状态的所有可能导航。

WorkflowNavigation

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

现在我被困在如何获得工作流的层次结构级别。我曾尝试使用 WITH 子句进行自联接,但由于可逆流,它给了我一个无限循环。我只想从WorkflowNavigation表中查询如下信息(基本上,它是WorkflowNavigation的干净版本,即没有反向流程)。

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

然后我想从上面的查询中获得如下信息。

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

任何人都可以帮我解决T-SQL查询问题。谢谢!

1 个答案:

答案 0 :(得分:0)

您想要从第一个节点遍历图形。您的图表具有周期,因此您需要一种不重新访问先前节点的方法。以下方法使用字符串来存储已访问过的节点。查询类似于:

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;