有表格:
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
并查找root和if type = 0 set allowed = 1
的所有记录。例如,它必须set allowed = 1 where id = 61 and 1
。怎么做?
答案 0 :(得分: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
是一个整数,指定语句终止前的最大递归次数。