递归CTE生成临时表后通过外键ID获取父级PARAM_VALUE赋值给子级的实现问题
解决方案
你当前的查询仅筛选出了所有被作为父级引用的行,没有完成子行与父行PARAM_VALUE的关联赋值,可根据你的层级关联需求选择对应实现方式:
单层父子关联(仅子级继承直接父级参数)
查询获取结果
SELECT child.ID, child.BRIEF, child.REFERENCE, -- 逻辑可调整:子行自身有值则保留,无值则取父级值 COALESCE(child.PARAM_VALUE, parent.PARAM_VALUE) AS PARAM_VALUE FROM @BOQ_TABLE child LEFT JOIN @BOQ_TABLE parent ON child.BOQ_ITEM_FK = parent.ID
更新临时表原有字段
如果需要直接修改临时表中的PARAM_VALUE值,执行以下语句:
UPDATE child SET child.PARAM_VALUE = parent.PARAM_VALUE FROM @BOQ_TABLE child INNER JOIN @BOQ_TABLE parent ON child.BOQ_ITEM_FK = parent.ID -- 可加筛选条件仅更新子级本身无值的行:WHERE child.PARAM_VALUE IS NULL
多层级递归关联(孙级及以下节点可继承所有上级参数)
如果你的节点存在多层嵌套,需要递归传递PARAM_VALUE,可在递归CTE中完成值的继承:
WITH RecursiveBOQ AS ( -- 锚点:匹配根节点,判断条件可根据你的实际规则调整(如BOQ_ITEM_FK = 0) SELECT ID, BRIEF, REFERENCE, PARAM_VALUE, BOQ_ITEM_FK, PARAM_VALUE AS INHERITED_PARAM_VALUE FROM @BOQ_TABLE WHERE BOQ_ITEM_FK IS NULL UNION ALL -- 递归关联上级,继承上级参数值 SELECT c.ID, c.BRIEF, c.REFERENCE, c.PARAM_VALUE, c.BOQ_ITEM_FK, COALESCE(c.PARAM_VALUE, p.INHERITED_PARAM_VALUE) AS INHERITED_PARAM_VALUE FROM @BOQ_TABLE c INNER JOIN RecursiveBOQ p ON c.BOQ_ITEM_FK = p.ID ) SELECT ID, BRIEF, REFERENCE, INHERITED_PARAM_VALUE AS PARAM_VALUE FROM RecursiveBOQ
内容的提问来源于stack exchange,提问作者Vats
相关产品推荐
相关产品推荐

