如何从物料清单表中获取递归数据

时间:2010-09-10 17:47:37

标签: sql sql-server-2008

这是在SQL Server 2008中。

我计划创建两个表来表示物料清单。物品主数据的数据如下: -

[ID] [商品代码] [商品描述]

1 ---- A001 ----组装1
2 ---- B001 ----子组件1(组装1的子组)
3 ---- B002 ----子装配2(装配1的子装)
4 ---- C001 ----第1部分(子装配1的子)
5 ---- C002 ----组件2(子组件子2)

BOM关系表将具有如下数据。 [Parent Item ID]和[Child Item ID]是Item master的外键。 : -

[ID] [父项目ID] [子项目ID]

1 ---- 1 ---- 2
2 ---- 1 ---- 3
3 ---- 2 ---- 4
4 ---- 3 ---- 5

所以第一个表只有项目本身,而另一个表有关于哪个父ID有哪些孩子的关系。

如果可能需要根据添加到上表中的数据递归迭代,那么获取Assembly的所有子项(A001)的SQL是什么?

因此,对于上述数据,我应该得到如下输出: -

1)A001

                1.1) B001       
                               1.1.1)C001      
                1.2) B002         
                               1.2.1) C002  

谢谢, 泽。

2 个答案:

答案 0 :(得分:2)

使用recursive CTE。例如:

WITH BomTree (ID, Level, [Item Code], [Item Description], Depth)
AS
(
-- Anchor member definition
    SELECT m.*, 0 AS Depth
    FROM dbo.Master AS m
    WHERE m.[ID] = ?
    UNION ALL
-- Recursive member definition
    SELECT m.*, t.Depth + 1 AS Depth
    FROM dbo.Master AS m
    INNER JOIN dbo.BOM AS b
        ON m.[ID] = b.[Child Item ID]
    INNER JOIN BomTree AS t
        ON b.[Parent Item ID] = t.ID
)
-- Statement that executes the CTE
SELECT * FROM BomTree; 

答案 1 :(得分:1)

您需要使用recursive common table expression对当前结构执行此操作。

SQL Server 2008中还有一个hierarchyid类型,可以使事情更简单。