t-sql - 为多个选择执行递归 t-sql 的最简单方法

标签 t-sql

我正在开发一个 Material list 成本计算器程序,我正在努力寻找一个简单的解决方案来解决我想要的一些递归选择。

我正在使用 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 语句中容纳它。

简而言之,我需要展开与父产品关联的所有组件的完整组件列表,无论它们是在子组件中还是子组件的子组件等中......

理想情况下,我想不惜一切代价避免出现光标:)

任何帮助/指导将不胜感激。

谢谢。

编辑; 根据要求,这是表结构和预期输出。父节点是 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  

最佳答案

如果我理解(并且没有表格结构),你可以尝试这样的事情

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

关于t-sql - 为多个选择执行递归 t-sql 的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1764292/

相关文章:

sql-server - 计算发货时间超过 X 天的订单百分比的更好方法?

sql-server-2008 - T-SQL 错误处理在 "BEGIN CATCH" block 中完全关闭了吗?

sql - sql中的高级单词搜索

sql - 限制 SQL 中的结果

sql-server - 计算表名在存储过程中出现的次数

t-sql - 查找并替换主字符串中的字符串

sql - 状态更改之间的天数

sql - 如何选择具有相关值的行?

t-sql - 是否可以限制表仅在一组列中的一个中具有值

sql-server - 更新列的脚本