这是在SQL Server 2008中。
我计划创建两个表来表示物料清单。物品主数据的数据如下: -
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的外键。 : -
1 ---- 1 ---- 2
2 ---- 1 ---- 3
3 ---- 2 ---- 4
4 ---- 3 ---- 5
所以第一个表只有项目本身,而另一个表有关于哪个父ID有哪些孩子的关系。
如果可能需要根据添加到上表中的数据递归迭代,那么获取Assembly的所有子项(A001)的SQL是什么?
因此,对于上述数据,我应该得到如下输出: -
1.1) B001
1.1.1)C001
1.2) B002
1.2.1) C002
谢谢, 泽。
答案 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类型,可以使事情更简单。