2014-02-12 70 views
1

有表所示:查找PARENT_ID記錄和更新一些領域

type ID PARENT_ID allowed 
0  1  0   0 
0  61  1   0 
0  148  61   1 
0  149  148   1 
1  100  149   0 
1  122  149   0 
...  ...  ...  ...    

要選擇那些parent_id where allowed = 1並找到所有記錄,而根和if type = 0 set allowed = 1。例如它必須set allowed = 1 where id = 61 and 1。怎麼做 ?

+0

你使用的是哪個版本的MS SQL Server的? –

+0

@HamletHakobyan 2008 – GeoVIP

+0

@GeoVIP從我自己的經驗來說提供的表結構是一種痛苦的...嘗試與血統,而不是PARENT_ID工作是爲記錄的血統之上將是:/ 1 /,/ 1/61/,/ 1 /148分之61/,/ 1/6 /149分之148的/ etc ...所以61的孩子,可以發現:其中譜系像 '/ 1/61 /%',這是一個非常強大的方案你」當時有。我遇到的唯一缺點是如果你能夠移動樹中的節點,你需要更多的工作。 – Paul

回答

2

在SQL Server 2005或更新,使用遞歸CTE找到所有的父記錄到根目錄,然後執行更新:

WITH CTE (id, parent_id) AS 
(
    SELECT id, parent_id 
    FROM MyTable WHERE allowed = 1 
    UNION ALL 
    SELECT MyTable.id, MyTable.parent_id 
    FROM MyTable INNER JOIN CTE ON CTE.parent_id = MyTable.id 
) 
UPDATE MyTable FROM MyTable WHERE EXISTS(SELECT NULL FROM CTE WHERE CTE.id=MyTable.id) 
SET allowed = 1 

如果您需要限制CTE的遞歸(例如,當調試以防止無限遞歸),您可以使用MAXRECURSION提示。爲此,請將代碼OPTION (MAXRECURSION x)添加到語句的末尾。這裏,x是一個整數,用於指定語句終止前的最大遞歸次數。

+1

爲什麼您將ID存儲在臨時表中。直接與CTE進行更新存在不是更好嗎? – Arion

+1

這將是很好的在你的左右選擇MAXRECURSION回答說。 –

+0

@Arion謝謝 - 你是對的。編輯我的答案。 – Dan