Sql 更新行和所有“父项”(如果存在)

Sql 更新行和所有“父项”(如果存在),sql,sql-server,parent,cascade,Sql,Sql Server,Parent,Cascade,我需要一个帮助来执行一个查询,其中我首先根据描述和所有父项(如果存在)更新一行 我的表格项目菜单: 身份证 名称 父母 活跃的 因此,我需要activate set BolActive=1一行,其中的描述我将在查询中通知,然后如果IdParent不为null/空白,并且它存在于同一个表IdParent=Id中,则更新所有行 比如: 更新项菜单集BolActive=1,其中DescName='MyMenu' 然后,我需要检查IdParent是否不在存在DescName='MyMenu'的项目菜单中

我需要一个帮助来执行一个查询,其中我首先根据描述和所有父项(如果存在)更新一行

我的表格项目菜单:

身份证

名称

父母

活跃的

因此,我需要activate set BolActive=1一行,其中的描述我将在查询中通知,然后如果IdParent不为null/空白,并且它存在于同一个表IdParent=Id中,则更新所有行

比如:

更新项菜单集BolActive=1,其中DescName='MyMenu'

然后,我需要检查IdParent是否不在存在DescName='MyMenu'的项目菜单中选择*from ItemMenu

如果是,我将更新ItemMenu set BolActive=1,其中IdParent来自上一个select=Id,并再次检查此处是否存在IdParent。。。直到IdParent为空/空白并停止

可能吗


另外,我无法更改表结构。

假设我理解所需的代码结果,请尝试使用递归公共表表达式进行更新。提供了一个截图。为我的noob文本格式道歉


假设我理解了所需的代码结果,请尝试使用递归公共表表达式进行更新。提供了一个截图。为我的noob文本格式道歉


当然有可能。您可以使用递归cte来实现这一点。如果您需要一些帮助,那么如果您可以发布ddl和一些示例数据,这将是最有帮助的。当然这是可能的。您可以使用递归cte来实现这一点。如果您需要一些帮助,那么如果您可以发布ddl和一些示例数据,这将非常有帮助。效果非常好,我刚刚将Menu2.idParent=CTE.Id更改为Menu2.Id=CTE.idParent。谢谢你/是的woops很抱歉弄错了。很高兴你找到了答案。效果很好,我刚刚将Menu2.idParent=CTE.Id改为Menu2.Id=CTE.idParent。谢谢你/是的woops很抱歉弄错了。很高兴你知道了。
DECLARE @description AS VARCHAR(50) = 'Hello World'

;WITH CTE AS (

    SELECT  Menu.*
    FROM    dbo.ItemMenu Menu
    WHERE   Menu.descname = @description
    UNION   ALL
    SELECT  Menu2.*
    FROM    dbo.ItemMenu Menu2
    JOIN    CTE
    ON      Menu2.idParent = CTE.Id
)
Update  ActualMenu
SET     BolActive = 1 
FROM    CTE Menu
JOIN    dbo.ItemMenu ActualMenu
ON      ActualMenu.Id = Menu.Id