我有一张桌子,我们称之为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中没有的内容
答案 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')