Sql 更新行和所有“父项”(如果存在)
我需要一个帮助来执行一个查询,其中我首先根据描述和所有父项(如果存在)更新一行 我的表格项目菜单: 身份证 名称 父母 活跃的 因此,我需要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为空/空白并停止 可能吗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'的项目菜单中
另外,我无法更改表结构。假设我理解所需的代码结果,请尝试使用递归公共表表达式进行更新。提供了一个截图。为我的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