db2 - DB for z/OS 中的递归查询
问题描述
亲爱的,我有一个名为“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
我尝试了如下递归查询,但它循环循环引用示例 BD 和 DB
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;
解决方案
您可以添加额外的列(链),其中包含当前行的完整路径,如下所示。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;
推荐阅读
- android - 如何确保在来自 Android Volley 的 API 请求中使用 TLS 1.2?
- c# - 如何为具有技能的虚拟助手机器人实施 OAuth 提示身份验证
- c++ - 通过带有成员函数指针的 QHash 调用成员函数的正确方法
- c++ - 除了使用clock()函数之外,有没有更好的方法以给定的频率生成/发布数据
- java - 为什么继承的方法使用未重新定义的变量?
- azure-devops - 是 Azure DevOps 构建管道,有没有办法从另一个作业中取消一个管道作业?
- javascript - vue绑定类不更新
- javascript - Wocommerce:如何停止滚动到结帐底部 - 在 update_checkout 触发器上
- android - 表情符号键盘不显示 Edittext
- javascript - 模板项目中的现有模板组件