具有以下结构和示例数据的表:
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”。查询应通过“Transfers”返回与“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
}