次の構造とサンプル データのテーブルを使用します。
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' の 'Start' アクティビティを検出し、'a' の 'Transfer' アクティビティを検出します。その時点で、関数は「b」を使用して再帰し、その結果、サンプル データを使用して「c」を使用できます。クエリは、「Transfers」を介して「a」に関連するすべてのアクティビティを返す必要があります。このアクティビティのネストは、必要なだけ深くすることができ、不明です (つまり、union はありません)。私が抱えている問題は、'b' -> 'a' など、別の 'Transfer' バックダウンがあることです。これにより、再帰クエリでループがどのように作成されるかがわかります。
もう 1 つ明確にします。アクティビティ テーブル内の転送は、スタックとして動作します。テーブルにデータが入力される方法を次に示します (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
}