查找parent_id的记录并更新一些字段

时间:2014-02-12 12:39:05

标签: sql sql-server sql-server-2008 tsql stored-procedures

有表格:

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。怎么做?

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是一个整数,指定语句终止前的最大递归次数。