我正在尝试从分层工程 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 是一个带有子组件的中级子组件,因此由于子组件在输出中,我不需要该子组件。
您可以在最后的
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;