2015-05-29 58 views
0

我想在SQL Server中編寫一個查詢來提取鏈接到任務的所有信息,但我遇到了一些問題。我想要發生的是當我傳入一個參數(@TaskID)併爲此返回該ID的任務信息以及與該ID相關的任何子任務信息時。T-SQL遞歸函數 - 帶有ParentID的CTE

問題是,一旦你到達第一個子任務,它就會失去它與整個Parent TaskID的鏈接。例如:TaskID(3)最終鏈接到TaskID(1),但因爲它是TaskID(2)的子任務,所以除非將父節點(TaskID 1)連接到TaskID 2,然後連接到TaskID 3,否則無法檢查

我們想要做的是有無數的子任務,但這需要太多的連接。

我想知道是否有更好的方法?

表結構或明智的查詢。

樣本表結構 Table Structure

WITH cte AS (
SELECT 
    t.TaskID 
    ,t.Title 
    ,t.ParentID 
    ,CAST(t.TaskID AS NVARCHAR(MAX)) [Path] 
FROM 
    tasks.Tasks t 
WHERE 
    t.TaskID = 3 

UNION ALL 

SELECT 
    c.ParentID 
    ,c.Title 
    ,t.ParentID 
    ,c.[Path] + '->' + CAST(t.TaskID AS NVARCHAR(MAX)) 
FROM 
    tasks.Tasks t 
    INNER JOIN cte c on c.ParentID = t.TaskID 
) 

SELECT 
    cte.TaskID 
    ,cte.Title 
    ,cte.[Path] 
FROM 
    cte 
WHERE 
    cte.ParentID IS NULL 

這給出正確的結果,但我真的應該傳遞的TaskID沒有PARENTID,因爲這將是頂級水平。所以,而不是在我的代碼塊t.TaskID = 3,我想通過1.我會玩...

+4

公用表表達式是要走的路,雖然無限的可能是一個問題:P另一種看法:在任務類型和名稱是一個字符串,將導致大量的浪費空間。什麼版本的SQL Server? – UnhandledExcepSean

+2

可能重複[Sql Hierarchy循環查詢](http://stackoverflow.com/questions/18427154/sql-hierarchy-loop-query) – Amit

+1

這是上述^^^^^ 的副本,但如果您想要您需要添加更多100個循環 OPTION(MAXRECURSION 1000) 到CTE的底部 –

回答

1

這對我有效。傳遞'1'作爲TaskID現在將允許我查看與其相關的所有子任務(在示例2中爲& 3)。

WITH cte AS 
(
SELECT 
    t.TaskID 
    ,t.Title 
    ,t.ParentID 
    ,CONVERT(VARCHAR(MAX),'') AS [Path] 
FROM 
    tasks.Tasks t 
WHERE 
    t.ParentID IS NULL 
    AND t.TaskID = @TaskID 

UNION ALL 

SELECT 
    sub.TaskID 
    ,sub.Title 
    ,sub.ParentID 
    ,cte.[Path] + '->' + CONVERT(VARCHAR(MAX),sub.TaskID) AS [Path] 
FROM 
    tasks.Tasks sub 
    INNER JOIN cte ON cte.TaskID = sub.ParentID 
) 

SELECT 
    cte.TaskID 
    ,cte.Title 
    ,cte.ParentID 
    ,CONVERT(VARCHAR(MAX),@TaskID) + cte.[Path] AS [Path] 
FROM 
    cte 

感謝大家的幫助