在层次结构中进行 SQL 递归 CTE 查找以获得仅零件的扁平 BOM

问题描述 投票:0回答:1

我正在尝试从分层工程 BOM 创建一个仅零件的平面采购/制造 BOM。数据库设置有列出所有零件编号的 PATMASER 表和包含所有组件的 PARENT、CHILD 列的 BOMLEGER 表。我正在使用以下代码来获取我的平面 BOM

WITH cteBuildPath AS
   (
   --=== This is the "anchor" part of the recursive CTE.
     -- The only thing it does is load the Root Node.
      SELECT ROOT.PARENT_PARTMASTER_CODE, ROOT.CHILD_PARTMASTER_CODE, ROOT.BOMLEGER_QTY
       FROM BOMLEGER ROOT
       WHERE ROOT.PARENT_PARTMASTER_CODE LIKE '%10550-03A%'--The Root Node
    UNION ALL
     --==== This is the "recursive" part of the CTE that adds 1 for each level
     -- and concatenates each level of EmployeeID's to the SortPath column.
      SELECT 
            PARENT.PARENT_PARTMASTER_CODE, 
            --CHILD.PARENT_PARTMASTER_CODE as SUBPARENT,
            CHILD.CHILD_PARTMASTER_CODE, 
            CONVERT(decimal(6,2),PARENT.BOMLEGER_QTY*CHILD.BOMLEGER_QTY)
       FROM 
            cteBuildPath PARENT, 
            BOMLEGER CHILD
       WHERE PARENT.CHILD_PARTMASTER_CODE = CHILD.PARENT_PARTMASTER_CODE
   )
   --=== This final SELECT/INTO creates the Node # in the same order as a
     -- push-stack would.
SELECT PARENT_PARTMASTER_CODE AS PARENT, 
--SUBPARENT,
CHILD_PARTMASTER_CODE AS CHILD, 
SUM(BOMLEGER_QTY) AS "Total QTY"

 FROM cteBuildPath
  GROUP BY PARENT_PARTMASTER_CODE, CHILD_PARTMASTER_CODE
  ORDER BY PARENT_PARTMASTER_CODE, CHILD_PARTMASTER_CODE;

我得到了结果

家长 孩子 总数量
10550-03A CMP-0000003 2.00
10550-03A 硬-0000816 8.00
10550-03A 硬-0000817 8.00
10550-03A 硬-0000834 24.00
10550-03A 硬-0000835 24.00
10550-03A 硬-0000840 24.00
10550-03A 硬-0000866 6.00
10550-03A 硬-0000868 8.00
10550-03A 硬-0000872 4.00
10550-03A 硬-0000874 4.00
10550-03A 硬-0001047 4.00
10550-03A 硬-0001103 8.00
10550-03A MECH-0001409 4.00
10550-03A PLT-0000131 2.00
10550-03A PLT-0000132 1.00
10550-03A PLT-0000133 4.00
10550-03A PLT-0000134 1.00
10550-03A PLT-0000135 1.00
10550-03A PLT-0000136 1.00
10550-03A PLT-0000137 1.00
10550-03A PLT-0000138 4.00
10550-03A PLT-0000139 2.00
10550-03A PLUMB-0001378 2.00
10550-03A PUR-0000003 4.00
10550-03A PUR-0000004 1.00
10550-03A PUR-0000005 4.00
10550-03A PUR-0000006 2.00
10550-03A STR-0000138 4.00
10550-03A STR-0000139 2.00
10550-03A STR-0000140 4.00
10550-03A STR-0000141 4.00
10550-03A STR-0000142 1.00
10550-03A STR-0000143 1.00
10550-03A STR-0000144 2.00
10550-03A STR-0000145 1.00
10550-03A STR-0000146 1.00
10550-03A STR-0000147 1.00
10550-03A STR-0000148 2.00
10550-03A STR-0000149 2.00
10550-03A STR-0000150 2.00
10550-03A STR-0000151 2.00
10550-03A STR-0000152 1.00
10550-03A STR-0000153 2.00
10550-03A STR-0000154 2.00
10550-03A STR-0000155 4.00
10550-03A STR-0000156 2.00
10550-03A SUB-0000018 1.00
10550-03A WLD-0000120 1.00
10550-03A WLD-0000122 1.00
10550-03A WLD-0000123 1.00
10550-03A WLD-0000124 1.00
10550-03A WLD-0000125 2.00

问题是我在结果中得到了所有中间子组件,但我不想要它们。因此 SUB-0000018 是一个带有子组件的中级子组件,因此由于子组件在输出中,我不需要该子组件。

sql recursion common-table-expression hierarchy
1个回答
0
投票

您可以在最后的

NOT EXISTS
上添加一个
SELECT
来检查它是否是底层部分。

WITH cteBuildPath AS
(
   --=== This is the "anchor" part of the recursive CTE.
     -- The only thing it does is load the Root Node.
      SELECT
        ROOT.PARENT_PARTMASTER_CODE,
        ROOT.CHILD_PARTMASTER_CODE,
        ROOT.BOMLEGER_QTY
      FROM BOMLEGER ROOT
      WHERE ROOT.PARENT_PARTMASTER_CODE LIKE '%10550-03A%'--The Root Node

    UNION ALL

     --==== This is the "recursive" part of the CTE that adds 1 for each level
     -- and concatenates each level of EmployeeID's to the SortPath column.
    SELECT 
        PARENT.PARENT_PARTMASTER_CODE, 
        CHILD.CHILD_PARTMASTER_CODE,
        CONVERT(decimal(6,2), PARENT.BOMLEGER_QTY * CHILD.BOMLEGER_QTY)
    FROM 
      cteBuildPath PARENT
    JOIN BOMLEGER CHILD
        ON PARENT.CHILD_PARTMASTER_CODE = CHILD.PARENT_PARTMASTER_CODE
)
   --=== This final SELECT/INTO creates the Node # in the same order as a
     -- push-stack would.
SELECT
  PARENT_PARTMASTER_CODE AS PARENT, 
  CHILD_PARTMASTER_CODE AS CHILD, 
  SUM(BOMLEGER_QTY) AS "Total QTY"
FROM cteBuildPath bp
WHERE NOT EXISTS (SELECT 1
    FROM BOMLEDGER_ROOT child
    WHERE child.PARENT_PARTMASTER_CODE = bp.CHILD_PARTMASTER_CODE
)
GROUP BY
  PARENT_PARTMASTER_CODE,
  CHILD_PARTMASTER_CODE
ORDER BY
  PARENT_PARTMASTER_CODE,
  CHILD_PARTMASTER_CODE;
© www.soinside.com 2019 - 2024. All rights reserved.