的曲線圖具有以下結構和樣本數據的一個表:TSQL CTE和排序
TableActivity
-------------
Type VARCHAR(8)
Activity VARCHAR(8)
RelatedActivity VARCHAR(8)
Type Activity RelatedActivity
------------------------------------------
Start a -
Transfer a b
Start b -
Transfer b c
Start c -
Stop c -
Transfer c b
Stop b -
Transfer b a
Stop a -
纔有可能寫一個CTE查詢來完成下列工作:
GetActivities('a')
Order Activities
-------------------
0 a
1 b
2 c
我在寫一個停止在遞歸語句中返回行的時候,有一段艱難的時間。
任何想法?
編輯
爲了闡明GetActivities( 'A')。此功能應找到'a'的'開始'活動,並繼續在'a'上找到任何'轉移'活動。在這一點上,函數可以用'b'遞歸,並且隨後用樣本數據遞歸'c'。查詢應通過「轉賬」返回與'a'相關的所有活動。這種嵌套的活動可以儘可能地深入並且是未知的(因此沒有工會)。我遇到的困難是還有另一個「轉移」,例如, 'b' - >'a'。你可以看到這將如何在遞歸查詢中創建一個循環。
再一次澄清:活動表中的傳輸表現爲堆棧。下面是如何在表格中填充數據(使用C#):
using (Activity.Start("a"))
{
// transfer to 'b' under covers
using (Activity.Start("b"))
{
// transfer to 'c' under covers
using (Activity.Start("c"))
{
}
// transfer to 'b' under covers
}
// transfer to 'a' under covers
}
不會處理更大的循環。在你的例子中添加「UNION SELECT'Transfer','c','a'」。 – 2009-11-06 22:56:36
幸運的是,這種情況不會發生在我的應用程序中:活動遍歷的行爲像一個堆棧。 – jsw 2009-11-06 23:57:13
啊。這是一個更簡單的情況,然後處理有循環的普通有向圖。 – 2009-11-07 01:16:31