【问题标题】:DB2 CTE Recursion on one table, 6 levels一张表上的 DB2 CTE 递归,6 级
【发布时间】:2023-03-23 09:33:02
【问题描述】:

我必须在列值中包含父/子关系的 db2 表上编写递归。这是一个糟糕的设计,但不幸的是我无法控制它。这是来自 SalesForce 的数据转储。

转储表中的每条记录代表一个级别的产品代码分组。从顶层 Industrial、AG、OIL 等开始,每个组都有带有组代码的子组,直到到达包含实际产品代码的底层。 给定产品代码 (STCC_RECORD_ID),我需要检索最高父级的 GROUP_CODE。我被卡住了,任何见解将不胜感激。这是我最新版本的 SQL:

WITH X(ID,STCC_RECORD_ID,PARENT_ID,GROUP_CODE,SEG_NAME) AS 
(
SELECT P.ID,P.STCC_RECORD_ID,P.PARENT_ID,P.GROUP_CODE,P.SEG_NAME
        FROM HB_EXTRACT.SEGMENTATION P
        WHERE STCC_RECORD_ID='0113211' 
UNION ALL
SELECT ID,STCC_RECORD_ID,PARENT_ID,GROUP_CODE,SEG_NAME
        FROM x
        WHERE x.PARENT_ID = ID
) 
SELECT * FROM X

这里是它的输出。只有底部记录显示:

这是所需的输出:

【问题讨论】:

    标签: sql recursion db2 common-table-expression


    【解决方案1】:

    据我了解,您必须使用自下而上的方法。

    WITH X(ID,STCC_RECORD_ID,PARENT_ID,GROUP_CODE,SEG_NAME, Level) AS 
    (
    SELECT P.ID,P.STCC_RECORD_ID,P.PARENT_ID,P.GROUP_CODE,P.SEG_NAME, 0
            FROM HB_EXTRACT.SEGMENTATION P
            WHERE STCC_RECORD_ID='0113211' 
    UNION ALL
    SELECT P.ID,P.STCC_RECORD_ID,P.PARENT_ID,P.GROUP_CODE,P.SEG_NAME, Level+1
            FROM x, HB_EXTRACT.SEGMENTATION P
            WHERE x.STCC_RECORD_ID=P.PARENT_ID
            AND Level<7
    ) 
    SELECT * FROM X
    WHERE Level>4
    

    在每次迭代中,您会根据当前记录加入下一个级别(父级)。 level 列用于稍后选择表 X 的特定层。

    【讨论】:

    • 为什么有等级限制? OP无法提前知道树有多深。哦,,不要使用逗号分隔的 FROM 子句 - 只需明确列出 JOIN
    • 上面写着6级,是测试的预防措施。
    • 谢谢,这有助于解决我缺少的一些事情,比如水平......但它仍然只是返回底部(顶部?)记录,和以前一样。几乎就像它与 parent_id 不匹配,但是当我手动查看它时,它们肯定匹配。或者,它没有进行递归。我会继续努力的,感谢您的帮助。
    • @Clockwork-Muse 当我尝试使用任何类型的 Join 时出现错误并说“在递归操作的全选中不允许包含 ON 子句的显式连接”
    • @CalHarris - 我忘记了那个特殊的限制,虽然我不记得它是否影响 DB2 的所有平台。请注意,某些版本的 DB2 还支持 CONNECT BY 运算符,这也适用于此。
    猜你喜欢
    • 2018-01-12
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 2020-06-17
    • 2018-03-30
    • 2015-09-10
    相关资源
    最近更新 更多