我正在开发物料清单成本计算器程序,我正在努力探索一些简单的解决方案来处理我想要的一些递归选择。
我在这部分应用程序中使用SQL Server 2005。
假设我有产品A,其中包含装配B和C部分。装配B将包含部件D和E,但是,这里是我奋斗的地方,D和或E可能包含X个其他部件。
我可以做一些事情;
SELECT * FROM TBLBOM WHERE Parent = A
UNION
SELECT * FROM TBLBOM WHERE Parent = B
UNION
SELECT * FROM TBLBOM WHERE Parent = C
产生一些东西;
PARENT COMP COST
A X £1
B D £0.5
B E £0.5
....
C Y £1
但是我们可以说组件D由组件F&组成。 G,我将如何在t-sql语句中容纳它。
简而言之,我需要扩展与父产品关联的所有程序集的完整组件列表,无论它们是在子程序集中还是在子程序集的子程序集中......
理想情况下,我想不惜一切代价避免光标:)
任何帮助/指导将不胜感激。
谢谢。
EDIT; 根据要求,这是表结构和预期输出。父节点是DRAWINGNO,子节点是PART(它本身也可以是父节点);
BOMID DRAWINGNO ITEM PART COST
1303 HGR05180 1 HGR05370 1
1304 HGR05180 2 HGF65050 4
1305 HGR05180 3 HGF50340 1
1312 HGR05370 1 HPN05075 1
1313 HGR05370 2 HPN05085 2
1314 HGR05370 3 HPN05080 1
1848 EXP-18G 1 HGR05180 1
1849 EXP-18G 2 HGR05210 3
1850 EXP-18G 3 HGR05230 1
1851 EXP-18G 4 HGR05140 1
1852 EXP-18G 5 HGR05150 2
1853 EXP-18G 6 HGR05050 1
1854 EXP-18G 7 ESC05350 1
1855 EXP-18G 8 ESC05330 3
1856 EXP-18G 9 HGR05360 1
1857 EXP-18G 10 HGR05370 2
1858 EXP-18G 11 ESC05640 1
答案 0 :(得分:5)
如果我理解(并且没有表格结构)你可以尝试这样的事情
DECLARE @Table TABLE(
Component VARCHAR(50),
Parent VARCHAR(50),
Cost FLOAT
)
INSERT INTO @Table SELECT 'B', 'A', 1
INSERT INTO @Table SELECT 'C', 'B', 2
INSERT INTO @Table SELECT 'C', 'B', 3
INSERT INTO @Table SELECT 'D', 'C', 4
DECLARE @Product VARCHAR(50)
SET @Product = 'A'
;WITH Selects AS (
SELECT *
FROM @Table
WHERE Parent = @Product
UNION ALL
SELECT t.*
FROM @Table t INNER JOIN
Selects s ON t.Parent = s.Component
)
SELECt *
FROm Selects
答案 1 :(得分:0)
您希望使用递归公用表表达式(CTE)。联机丛书有很多关于如何使用这些信息的信息;在索引中,查找CTE并选择“使用公用表表达式的递归查询”条目。 (我在网上链接到BOL之前遇到了问题,或者我试着在这里链接它。)
另外,如果你发布你的表结构,你应该在五分钟内得到六个例子。更好的是,尝试搜索SO以获取先前的示例。