【问题标题】:How can I order my db2 recursive sql to display the levels in a BOM by parent/child relationship如何命令我的 db2 递归 sql 按父/子关系显示 BOM 中的级别
【发布时间】:2021-09-24 08:53:39
【问题描述】:

以下查询获取所有结果,但未正确分组,例如:

01 xxx
   02 bbb
      03 ccc
   02 ddd
      03 eee
      03 fff
         04 ggg
   02 hhh
01 yyy
etc 

我的结果以升序显示

WITH EXPL (LEVEL,  I_TC_ITEM_ID, I_TC_PARNT_ITEM_ID ) AS
(
SELECT 1 as LEVEL,
     ROOT.I_TC_ITEM_ID,  ROOT.I_TC_PARNT_ITEM_ID 
      FROM   DVMP.TC_PTV ROOT
   WHERE  
            ROOT.C_VARIANT = DVMP.C_VARIANT AND
            ROOT.I_TC_ITEM_ID  = DVMP.I_TC_ITEM_ID 
    UNION ALL
      SELECT LEVEL + 1,
        CHILD.I_TC_ITEM_ID, CHILD.I_TC_PARNT_ITEM_ID
      FROM   EXPL PARENT, DVMP.TC_PTV CHILD
      WHERE  CHILD.I_TC_PARNT_ITEM_ID  = PARENT.I_TC_ITEM_ID AND
             CHILD.C_VARIANT = DVMP.C_VARIANT 
                 )
     SELECT * 
     FROM     EXPL 
order by  level, I_TC_PARNT_ITEM_ID

得到部分结果:

LEVEL   I_TC_ITEM_ID    I_TC_PARNT_ITEM_ID
1   FC00ABF40383    FC00ABF39972
2   FC00ABF40384    FC00ABF40383
2   FC00ABF40385    FC00ABF40383
2   FC00ABF40386    FC00ABF40383
3   FC00AAA92586    FC00ABF40384
3   FC00ABI44739    FC00ABF40384
3   FC00ABI44739    FC00ABF40384
3   FC00ABY43106    FC00ABF40384
3   AGV21336    FC00ABF40385
3   FC00AAA11475    FC00ABF40385
3   FC00AAA11499    FC00ABF40385
3   FC00AAW37134    FC00ABF40385
3   FC00AAZ81249    FC00ABF40385
3   FC00ABD51310    FC00ABF40385
3   FC00ABD51315    FC00ABF40385
3   FC00ABD51338    FC00ABF40385
3   FC00ABS71006    FC00ABF40385
3   FC00ABS71019    FC00ABF40385
3   FC00AAA92586    FC00ABF40386
3   FC00ABI44739    FC00ABF40386
3   FC00ABI44739    FC00ABF40386
3   FC00ABY43105    FC00ABF40386

我想要的结果是这样的:

LEVEL   I_TC_ITEM_ID    I_TC_PARNT_ITEM_ID
1   FC00ABF40383    FC00ABF39972
    2   FC00ABF40384    FC00ABF40383
        3   FC00ABI44739    FC00ABF40384
        3   FC00ABI44739    FC00ABF40384
        3   FC00ABY43106    FC00ABF40384
    2   FC00ABF40385    FC00ABF40383
        3   AGV21336    FC00ABF40385
        3   FC00AAA11475    FC00ABF40385
        3   FC00AAA11499    FC00ABF40385
        3   FC00AAW37134    FC00ABF40385
    2   FC00ABF40386    FC00ABF40383
        3   FC00AAA92586    FC00ABF40386
        3   FC00ABI44739    FC00ABF40386
          4   FC00ABI49612  FC00ABI44739
            5   FC00ABZ53105    FC00ABI49612

【问题讨论】:

  • 请仅使用相关列的一些数据样本(如 parent_id、child_id、desc)、您获得的结果和您想要的结果来编辑您的问题。如果没有实际数据,您的长 SQL 查询将毫无用处。要正确排序结果,您可以使用人工“链”列,其中您有当前行的所有父 ID 的分隔字符串表示,您在 ORDER BY 子句中使用。

标签: recursion db2 common-table-expression


【解决方案1】:

如果您需要根据从父到子、到孙等形成的“路径”对行进行排序,您可以在选择行时组装此路径。然后排序是微不足道的。

例如,我添加了ordering 列用于排序:

with
expl (level, i_tc_item_id, i_tc_parnt_item_id, ordering) as (
    select
      1 as level,
      root.i_tc_item_id,
      root.i_tc_parnt_item_id,
      '/' || root.i_tc_item_id
    from dvmp.tc_ptv root
    where root.c_variant = dvmp.c_variant
      and root.i_tc_item_id = dvmp.i_tc_item_id
  union all
    select
      level + 1,
      child.i_tc_item_id,
      child.i_tc_parnt_item_id,
      parent.ordering || '/' || child.i_tc_item_id
    from expl parent, dvmp.tc_ptv child
    where child.i_tc_parnt_item_id = parent.i_tc_item_id
      and child.c_variant = dvmp.c_variant
  )
select
  repeat('.   ', level - 1) || -- to indent according to level
  i_tc_item_id || ' - ' ||
  i_tc_parnt_item_id
from expl
order by ordering

【讨论】:

  • 执行此操作我得到 SQL0206N “EXPL.ORDERING”在使用它的上下文中无效。 SQLSTATE=42703 State:S0022,Native:-206,Origin:[IBM][CLI Driver][DB2/AIX64] 当我取出订购时,查询将运行,但我的原始结果的确切顺序是跨度>
  • @Munther 修正了错字。请重试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多