1

プロセスステージ情報を保存するプロセスステージのテーブルがあります。各プロセス ステージには、次のステージへの 1 つ以上のルートがあり、この情報は各ステージの xml 列に格納されます。

例:ステージサンプルデータ

stageId | stageXML
A | '<stage id="A"><routes><route id="1"><action><method>goToStage</method><arguments><id>B</id></arguments></action></route><route id="2"><action><method>goToStage</method><arguments><id>C</id></arguments></action></route><route id="3"><action><method>goToStage</method><arguments><id>D</id></arguments></action></route></routes></stage>'
B | '<stage id="B"><routes><route id="1"><action><method>goToStage</method><arguments><id>END</id></arguments></action></route></routes></stage>'
C | '<stage id="C"><routes><route id="1"><action><method>goToStage</method><arguments><id>A</id></arguments></action></route></routes></stage>'
D | '<stage id="D"><routes><route id="1"><action><method>goToStage</method><arguments><id/></arguments></action></route></routes></stage>'

テストデータを作成するための SQL:

CREATE TABLE #stages
(stageId CHAR(1), stageXML xml)

INSERT INTO
  #stages(stageId,stageXML)
VALUES
('A' , '<stage id="A"><routes><route id="1"><action><method>goToStage</method><arguments><id>B</id></arguments></action></route><route id="2"><action><method>goToStage</method><arguments><id>C</id></arguments></action></route><route id="3"><action><method>goToStage</method><arguments><id>D</id></arguments></action></route></routes></stage>'),
('B' , '<stage id="B"><routes><route id="1"><action><method>goToStage</method><arguments><id>END</id></arguments></action></route></routes></stage>'),
('C' , '<stage id="C"><routes><route id="1"><action><method>goToStage</method><arguments><id>A</id></arguments></action></route></routes></stage>'),
('D' , '<stage id="D"><routes><route id="1"><action><method>goToStage</method><arguments><id/></arguments></action></route></routes></stage>')

SELECT * from #stages

各ステージは、「END」の goToStage/id に到達するか、次のステージがない (goToStage/id がない)、または次のステージが既に渡されたステージになるまで、goToStage メソッドに従って次のステージに進みます。

したがって、私がする必要があるのは、SQL Server 2008+ を使用して次の結果を得ることです:

stageId | route
A | B, END
A | C, A, END
A | D, END

私はこれができると確信していますが、私はSQLを正しくするのに苦労しているので、どんな助けも素晴らしいでしょう.

前もって感謝します。

更新: 少しいじって、ルート データを次の形式に抽出することができました。

stageId | nextStageId
A | B
A | C
A | D
B | END
C | A
D | 

SQLを使用すると、誰かがこれからルートを作成するのを手伝ってくれるかもしれません。

SELECT  t.c.value('@id', 'VARCHAR(3)') AS stageId,
    t1.c1.value('.', 'VARCHAR(3)') AS nextStageId
FROM    #stages
CROSS APPLY stageXML.nodes('//stage') as T(C)
CROSS APPLY stageXML.nodes('//route/action/arguments/id') as T1(C1)
WHERE   stageXml.exist('//method[text()="goToStage"]') = 1
4

1 に答える 1

0

データにはループがあり、これは一般的なケースでは計算上扱いにくい問題です。たとえば、ルートはルートにC,A,B,ENDつながり、ルートはルートにつながります。C,A,C,A,B,ENDC,A,C,A,C,A,B,END

無向ルートグラフにはそのような文字列が無限にあるため、SQLが無限ループに陥ることなくこれを行う方法はありません。(CTEは無限再帰を許可しますが、サーバーをクラッシュさせるだけです。)

于 2012-06-29T15:07:03.293 に答える