DB2 z/OS 分层查询

Posted

技术标签:

【中文标题】DB2 z/OS 分层查询【英文标题】:DB2 z/OS hierarchical queries 【发布时间】:2015-09-15 19:53:26 【问题描述】:

我有一个包含两列的表,PARENT_PART 和 CHILD_PART。

如果输入零件,我需要所有链接的详细信息。该部分的所有子部分都需要在结果中。

Parent part Child part
OABCDEFG01  OABCDEFG02
OABCDEFG01  OABCDEFG03
OABCDEFG02  OABCDEFG04
OABCDEFG02  OABCDEFG05
OABCDEFG03  OABCDEFG06
OABCDEFG03  OABCDEFG07
OABCDEFG03  OABCDEFG08
OABCDEFG04  OABCDEFG09
OABCDEFG04  OABCDEFG10
OABCDEFG05  OABCDEFG11
OABCDEFG05  OABCDEFG12
OABCDEFG06  OABCDEFG13
OABCDEFG07  OABCDEFG14
OABCDEFG07  OABCDEFG15
OABCDEFG07  OABCDEFG16
OABCDEFG07  OABCDEFG17
OABCDEFG08  OABCDEFG18
OABCDEFG08  OABCDEFG19

如果我给出了 PARENT-PART = 'OABCDEFG02',则根据上表

结果应该如下:

PARENT-PART        CHILD-PART 
OABCDEFG02         OABCDEFG04 
OABCDEFG02         OABCDEFG05 
OABCDEFG04         OABCDEFG09
OABCDEFG04         OABCDEFG10 
OABCDEFG05         OABCDEFG11
OABCDEFG05         OABCDEFG12

我正在使用 DB2 for z/OS(大型机系统)。

【问题讨论】:

欢迎再次编辑。这次请不要删除格式。如果没有数据前面的四个空格,所有数据都会混合在一起。 不清楚是在使用第一个孩子作为父母后停止,还是在数据存在时继续。你能用你的样本数据和输出来澄清这一点吗?您是否还可以包含您尝试使用的查询,因为它会为您发现困难的部分提供一些想法。 【参考方案1】:

为此,您需要一个所谓的“公用表表达式”。它是一种递归查询,已添加到 SQL 标准和大多数数据库系统中以生成物料清单。我没有 DB2 for z/OS 可用并且无法测试,但这里是指向 documentation of common table expressions incl. some examples 的链接。

您的查询将如下所示:

WITH RPL (PART, CHILDPART) AS
     (  SELECT ROOT.PART, ROOT.CHILDPART
        FROM PARTLIST ROOT
        WHERE ROOT.PART = 'OABCDEFG02'
      UNION ALL
        SELECT CHILD.PART, CHILD.CHILDPART
        FROM RPL PARENT, PARTLIST CHILD
        WHERE  PARENT.CHILDPART = CHILD.PART
     )
SELECT DISTINCT PART, CHILDPART
 FROM RPL
  ORDER BY PART, CHILDPART

【讨论】:

感谢 henrik,将深度参数添加到上述查询后,它工作正常 嗨,muralikrishna,您还有关于深度参数的查询吗?

以上是关于DB2 z/OS 分层查询的主要内容,如果未能解决你的问题,请参考以下文章

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

使用 like 谓词(模式匹配)对 DB2 Z/oS 的 SQL 查询进行性能调优

DB2 v8 for z/OS 中的交叉连接

查询以选择具有特定最后一列的所有表 Ibm Db2 z/os

嵌套表表达式不适用于 db2 z/OS

DB2 Z/OS:查找表中缺失的数据