嵌套的子装配查找查询

时间:2017-03-27 15:34:06

标签: tsql sql-server-2008-r2

我有一张桌子,我们称之为Assemblies。该表包含这些项目的项目和组件。此外,这些组件中的每一个都可能被列为具有各自组件的项目,从而创建子组件列表。

这是我的小提琴。

http://sqlfiddle.com/#!3/ec9e9/1

在此示例中,A1000部分包含h123,其中包含T4000,其中包含z123。还有另一部分不属于该程序集的一部分。有没有办法设计一个查询,该查询将向下钻取到A1000的每个子组件,直到没有剩下的为止,而不必定义嵌套了多少个子组件?

结果如下:

item    component   qty
A1000   h123        4
h123    T4000       7
T4000   z123        2
z123    f2222       4

仅省略主要装配体A1000中没有的内容

2 个答案:

答案 0 :(得分:2)

递归公用表表达式(cte)适用于这样的事情。 怎么样?

;WITH cteAssemblies (item, component, qty, AssemblyLevel)
AS
(   SELECT
        item, component, qty, 1
    FROM
        dbo.Assemblies b
    WHERE
        item = 'A1000'
    UNION ALL
    SELECT
        e.item, e.component, e.qty, r.AssemblyLevel + 1
    FROM
        dbo.Assemblies  e
    INNER JOIN
        cteAssemblies r ON e.item = r.component
)
SELECT item, component, qty FROM cteAssemblies

答案 1 :(得分:1)

以上CTE作为函数创建。

CREATE FUNCTION dbo.FN_GetAssemblyChildren ( @item CHAR(30))
RETURNS  TABLE 
AS
RETURN
(

    WITH cteAssemblies (item, component, qty, AssemblyLevel)
    AS
    (   SELECT
            item, component, qty, 1
        FROM
            dbo.Assemblies b
        WHERE
            item = @item
        UNION ALL
        SELECT
            e.item, e.component, e.qty, r.AssemblyLevel + 1
        FROM
            dbo.Assemblies  e
        INNER JOIN
            cteAssemblies r ON e.item = r.component
    )
    SELECT item, component, qty FROM cteAssemblies

);

GO

查询功能

SELECT * FROM dbo.FN_GetAssemblyChildren ('A1000')