在 DB2/400 上使用 CONNECT_BY_ROOT 进行分层查询
Posted
技术标签:
【中文标题】在 DB2/400 上使用 CONNECT_BY_ROOT 进行分层查询【英文标题】:heirarchical query with CONNECT_BY_ROOT with join on DB2/400 【发布时间】:2021-01-12 14:54:24 【问题描述】:我想遍历包含程序和表的递归列表的表,以查找特定程序 MYPGM 及其子程序使用的所有程序和表。到目前为止,这是可行的:
SELECT CONNECT_BY_ROOT WHONAM AS TOP_LEVEL, WHONAM AS REF_A,
WHRNAM AS REF_B,
WHRTYP AS Obj_Type, WHRATR OBJ_ATTTR, WHUSG AS USAGE,
LEVEL WHONAM
FROM MYLIB/MYREF
START WITH WHONAM = 'MYPGM'
CONNECT BY PRIOR WHRNAM = WHONAM
现在我想对 table.field MYLIST.MY_PGM_NAME 中的所有程序执行相同的操作,而不仅仅是程序“MYPGM”。我在合并 JOIN 子句时遇到问题,不知道如何处理 START WITH 子句。希望我很清楚。
谢谢,
【问题讨论】:
【参考方案1】:考虑使用 SQL 标准语法进行递归。此处的 Db2 for i 手册中有一个物料清单示例https://www.ibm.com/support/knowledgecenter/en/ssw_ibm_i_72/db2/rbafzrecurse.htm
WITH RPL (PART, SUBPART, QUANTITY) AS
( SELECT ROOT.PART, ROOT.SUBPART, ROOT.QUANTITY
FROM PARTLIST ROOT
WHERE ROOT.PART = '01'
UNION ALL
SELECT CHILD.PART, CHILD.SUBPART, CHILD.QUANTITY
FROM RPL PARENT, PARTLIST CHILD
WHERE PARENT.SUBPART = CHILD.PART
)
SELECT DISTINCT PART, SUBPART, QUANTITY
FROM RPL
ORDER BY PART, SUBPART, QUANTITY
【讨论】:
以上是关于在 DB2/400 上使用 CONNECT_BY_ROOT 进行分层查询的主要内容,如果未能解决你的问题,请参考以下文章