在 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 进行分层查询的主要内容,如果未能解决你的问题,请参考以下文章

DB2/400 中的 if-else 语句

如何在 DB2/400 中创建生成的列

如何在 DB2 AS/400 中将十进制字段转换为日期字段?

在 DB2/400 中获取仅按用户分组的最新结果

DB2-400 中带有 CSSID 的十六进制值

DB2 AS400 Java 函数总是返回相同的值