DB for z/OS 中的递归查询

Posted

技术标签:

【中文标题】DB for z/OS 中的递归查询【英文标题】:Recursive query in DB for z/OS 【发布时间】:2021-03-11 15:04:49 【问题描述】:

亲爱的,我有一个名为“PROGRAM”的源表,如下所示

Program CSECT
X       Y
B       X
M       P
A       L
B       D
C       D
A       C
B       C
A       B
D       B

给定一个程序,例如“A”,我需要找到所有关联的 CSECT

Program CSECT
A       L
A       C
A       B
B       D
B       X
X       Y

我尝试过如下递归查询,但它会循环循环引用示例 B-D 和 D-B

WITH RPL (Program, Csect) AS
      (SELECT ROOT.Program, ROOT.Csect
         FROM Program ROOT
         WHERE Program = 'A'
      UNION ALL
         SELECT CHILD.Program, CHILD.Csect
            FROM RPL PARENT, Program CHILD
            WHERE PARENT.Csect = CHILD.Program)
 SELECT *
     FROM RPL;

【问题讨论】:

添加一个计数器和一个停止条件以避免无限循环。您还可以使用一些功能来检查一个值是否已经在您的方式中,尽管您的数据作为停止条件。 【参考方案1】:

您可以添加额外的列(链),其中包含当前行的完整路径,如下所示。如果CHILD.Program 已包含在此类路径中,则不应添加新行。

WITH RPL (Program, Csect, Chain) AS
(
SELECT ROOT.Program, ROOT.Csect, CAST('|' || ROOT.Program || '|' AS VARCHAR(1000))
FROM Program ROOT
WHERE Program = 'A'
    UNION ALL
SELECT CHILD.Program, CHILD.Csect, PARENT.Chain || CHILD.Program || '|' 
FROM RPL PARENT, Program CHILD
WHERE PARENT.Csect = CHILD.Program
    AND LOCATE('|' || CHILD.Program || '|', PARENT.Chain) = 0
)
SELECT DISTINCT Program, Csect
FROM RPL
ORDER BY Program;

【讨论】:

以上是关于DB for z/OS 中的递归查询的主要内容,如果未能解决你的问题,请参考以下文章

DB2 中的递归查询以获取链中的所有项目

在 DB2 sql for z/os 中用 0 填充 smallint

db2 z/os 在动态查询中转换简单查询

对 DB2 for z/OS 的存储过程调用中不支持字符串文字

DB2 z/OS 分层查询

SQLAlchemy 递归查询结果集排序