0

次の構造とサンプル データのテーブルを使用します。

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
 }
4

4 に答える 4

0

再帰クエリは本当に必要ですか? 提供されたサンプル データに基づいて、アクティビティが停止する順序を逆に報告するだけで済みます。

declare @TableActivity table
([Type]              VARCHAR(8)
,Activity            VARCHAR(8)
,RelatedActivity     VARCHAR(8)
)


insert @TableActivity
      select 'Start','a','-'
union select 'Transfer','a','b'
union select 'Start','b','-'
union select 'Transfer','b','c'
union select 'Start','c','-'
union select 'Stop','c','-'
union select 'Transfer','c','b'
union select 'Stop','b','-'
union select 'Transfer','b','a'
union select 'Stop','a','-'


select activity
       ,ROW_NUMBER() OVER (ORDER BY activity) - 1 AS rn
from  @TableActivity
where [Type] = 'Stop'
order by 2
于 2009-11-06T08:33:45.140 に答える
0

「getactivities()」の意図したセマンティクスに関する詳細を提供できませんでした。

それは質問に答えるのを難しくします。

とにかく、「再帰」について言及したので、結果セットには、特定のアクティビティに関連するあらゆるレベルの間接的なアクティビティを含める必要があると思います。

「任意のレベルの間接化」部分のため、再帰を避けることはできません。大まかに次のように動作するはずです。

指定された一連の活動 ('a') から始めて、関連する活動 ('b') を見つけます。見つかった新しいアクティビティから、既に見つかったもの (なし) を削除します。残りのものを結果セットに追加し、このセットで繰り返します: 指定された一連の活動 ('b') で、関連する活動 ('a' 'c') を見つけます。見つかった新しいアクティビティから、既に見つかったもの ('a') を削除します。残りのもの ('c') を結果セットに追加し、このセットで繰り返します: 指定された一連の活動 ('c') で、関連する活動 ('b') を見つけます。見つかった新しいアクティビティから、既に見つかったもの ('b') を削除します。残りのもの (なし) を結果セットに追加します。何もなかったので、完了です。

申し訳ありませんが、これを SQL に変換することはできません。

于 2009-11-06T17:16:36.723 に答える