在 DB2/400 上使用 CONNECT_BY_ROOT 连接的分层查询

问题描述

我想遍历一个包含程序和表递归列表的表,以查找特定程序 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 子句。希望我清楚。

谢谢,

解决方法

考虑使用 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,QUANTITY
 FROM RPL
 ORDER BY PART,QUANTITY