很抱歉,如果我的标题不对,因为我不知道如何解释我的情况。我刚刚开始了一个新的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查询问题。谢谢!
答案 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;