递归CTE物料清单

时间:2014-03-10 20:48:30

标签: sql sql-server recursion common-table-expression

这是我的第一个问题,如果我不够清楚,请原谅我。

我的任务是获得装配(物料清单)所有组件的总成本。基本上,我想查询包含组件采购订单分配的表,这样我就可以获得当前与未发布组件相关联的成本。

它变得棘手,因为程序集的一个组件本身可能是一个程序集,在这种情况下,我需要查询另一个表,该表包含有关其他程序集是否链接到此主程序集的信息。 (我已经进行了检查以确保不会发生过度分配,但可能尚未分配任何内容,这没关系)在这种情况下,查询采购订单分配表以获取该组件编号的组件,并将这些成本添加到父集会的总计。

我第一次使用CTE,没有太多运气。任何人都可以帮助确定我在这里做错了吗?

锚点拉入所有组件,不包括子组件,以及它们的单位成本和主要组件的PO数量,我试图确定成本。

递归部分应该为已经在BM10200_AssemblyQtyDetail表上存在的“链接”的程序集提取组件,成本和数量。如果父程序集位于TRANNUM列中,则该行的TRX_ID是链接程序集,它是主程序集的子程序集组件。

USE HT
GO
WITH BOMCost (Assembly, Component, PriceFromPO, Qty, BOMLevel)
AS
(
-- Anchor member definition
SELECT asl.TRX_ID, asl.ITEMNMBR, asl.UNITCOST, asl.SERLTQTY,
0 AS BOMLevel
FROM HT.DBO.BM10400 AS asl
WHERE asl.TRX_ID = 'ASM0002909'
UNION ALL
-- Recursive member definition
SELECT asl.TRX_ID, asl.ITEMNMBR, asl.UNITCOST, asl.SERLTQTY,
    BOMLevel + 1
FROM HT.DBO.BM10400 AS asl
INNER JOIN HT.DBO.BM10200_AssemblyQtyDetail AS bqd 
    ON asl.TRX_ID = bqd.TRANNUM
INNER JOIN BOMCost AS bc
    ON bqd.TRX_ID = bc.Assembly
)


-- Statement that executes the CTE
SELECT Assembly, Component, PriceFromPO, Qty, BOMLevel
FROM BOMCost

重申一下,这里的问题是这只返回主程序集的组件没有任何子程序集相关的成本。所以只是顶级组件。我在链接表中有一条记录,将此BM的子装配的装配链接到主装配,但它不会拉出该装配编号的组件。我认为它可能与递归部分连接有关。任何帮助表示赞赏!

这是数据方案。 ASM0002909是一个组件,其组件本身就是一个组件。 ASM0002914正在为ASM0002909同时构建,它本身有两个组件。我只想得到实际从PO收到的费用,所以如果其他组件是必要的但尚未收到则无关紧要。这是所有应该总结的(SERLTQTY * UNITCOST)来获得主要装配的总成本。

Assembly Serial Lot Table

然而,这是我目前从查询中得到的结果。它应该运行一次递归步骤并返回ASM0002914结果。 Results from my CTE

我已经设置了一个带有两个主表,数据和我正在使用的sql查询的sqlfiddle,它仍然没有拾取子组件组件并返回超出递归限制的错误。 http://sqlfiddle.com/#!3/bd1b98/6

1 个答案:

答案 0 :(得分:2)

我可能会遗漏某些内容,但您的JOIN条件似乎排除了递归:

INNER JOIN BOMCost AS bc ON bqd.TRX_ID = bc.Assembly

ASM0002909不等于ASM0002914,因此底部没有结果。

更新

WITH BOMCost (Assembly, Component, PriceFromPO, Qty, BOMLevel)
AS
(
-- Anchor member definition
    SELECT asl.TRX_ID, asl.ITEMNMBR, asl.UNITCOST, asl.SERLTQTY,
    0 AS BOMLevel
    FROM DBO.BM10400 AS asl
    WHERE asl.TRX_ID = 'ASM0002909'
    UNION  ALL
-- Recursive member definition
    SELECT asl.TRX_ID, asl.ITEMNMBR, asl.UNITCOST, asl.SERLTQTY,
        BOMLevel + 1
    FROM DBO.BM10400 AS asl
    INNER JOIN DBO.BM10200_AssemblyQtyDetail AS bqd 
        ON asl.TRX_ID = bqd.TRX_ID
    INNER JOIN BOMCost AS bc
        ON bqd.TRANNUM = bc.Assembly

)


-- Statement that executes the CTE
SELECT DISTINCT Assembly, Component, PriceFromPO, Qty, BOMLevel
FROM BOMCost

演示:SQL Fiddle