2

私はテーブルを持っていますtask_dependencyは次のようになります

task_id   depend_task_id
-------------------------
1             NULL
2             NULL
3             1
4             2
4             1
5             4
5             3

クエリを実行して、各タスク(タスク自体を含む)の個別のタスク依存関係リストを取得しようとしています。

期待される出力(タスクリストの順序は関係ありません):

task_id depend_task_list
-----------------------------------------------
1       1;
2       2;
3       1;3
4       1;2;4
5       1;2;3;4;5

私が今まで持っているもの

DECLARE @t TABLE (task_id INT, depend_task_id INT)

INSERT INTO @t VALUES (1, NULL),(2,NULL),(3,1),(4,2),(4,1),(5,4),(5,3)

;WITH AllDependency (task_id,depend_task_list)
AS(  
   SELECT 
     task_id,
     depend_task_list=CAST(task_id AS VARCHAR(4000))
   FROM @t
   WHERE depend_task_id IS NULL
 UNION ALL
   SELECT 
     t.task_id,
     depend_task_list= CAST(CAST(t.task_id AS VARCHAR(10)) + ';' + depend_task_list AS VARCHAR(4000))
   FROM @t t
   INNER JOIN AllDependency  AS d
        ON d.task_id = t.depend_task_id
) 
SELECT 
    task_id,
    (SELECT depend_task_list + ';' FROM AllDependency d2 WHERE d.task_id = d2.task_id FOR XML PATH('')) AS depend_task_list
FROM AllDependency d
GROUP BY task_id
ORDER BY task_id

現在の出力:

task_id depend_task_list
-----------------------------------------
1           1;
2           2;
3           3;1;
4           4;2;4;1;
5           5;4;2;5;4;1;5;3;1;

質問:カーソルを使用せずに、個別のタスク依存関係リストを取得するにはどうすればよいですか?

SQLFiddleリンクhttp://sqlfiddle.com/#!3/4c034/2

よろしくお願いします。

4

1 に答える 1

3

わかりました、このクエリを試して、それが役立つかどうかを確認してください:

DECLARE @t TABLE (task_id INT, depend_task_id INT)

INSERT INTO @t VALUES (1, NULL),(2,NULL),(3,1),(4,2),(4,1),(5,4),(5,3)

;WITH CTE AS
(
    SELECT *
    FROM @t
    UNION ALL
    SELECT A.task_id, B.depend_task_id
    FROM CTE A
    INNER JOIN @t B
    ON A.depend_task_id = B.task_id
    --WHERE B.depend_task_id IS NOT NULL
), CTE2 AS 
(
    SELECT DISTINCT task_id, ISNULL(depend_task_id,task_id) depend_task_id
    FROM CTE
)
SELECT  t1.task_id, 
        STUFF( (SELECT ';' + CAST(t2.depend_task_id AS VARCHAR(5))
                FROM CTE2 t2
                WHERE t2.task_id = t1.task_id
                ORDER BY depend_task_id
                FOR XML PATH('')),1,1,'') AS depend_task_list
FROM CTE2 t1
GROUP BY task_id

これはsqlfiddleのテストです。

于 2012-06-08T14:54:12.087 に答える