Tsql函数返回直接父项而不是祖父母的父项id

Tsql函数返回直接父项而不是祖父母的父项id,tsql,Tsql,这是我数据库的结构:我有一个表tblMenu和表tblProduct。一个菜单可以有多个产品。该关系存储在tblMenu\u products表中。然而,一种产品可以由多种产品和多种成分组成。该关系保存在tblProduct\u components表中,在该表中我有一个名为table的列,以便我知道该成分是来自tblProduct还是tblingcredition 我需要做的是:对于一个菜单,列出它的所有直接和间接项。这意味着菜单上的所有产品,以及他们的所有产品和配料,以及他们的所有产品和配料

这是我数据库的结构:我有一个表
tblMenu
和表
tblProduct
。一个菜单可以有多个产品。该关系存储在
tblMenu\u products
表中。然而,一种产品可以由多种产品和多种成分组成。该关系保存在
tblProduct\u components
表中,在该表中我有一个名为
table
的列,以便我知道该成分是来自
tblProduct
还是
tblingcredition

我需要做的是:对于一个菜单,列出它的所有直接和间接项。这意味着菜单上的所有产品,以及他们的所有产品和配料,以及他们的所有产品和配料,等等

这是我在
tsql
中的函数:

CREATE function [dbo].[fnListInfo](@menu_id int) returns @res table(
 [id] [int] NOT NULL IDENTITY,
 [itemId] INT,
 [name] NVARCHAR(255),
 [type] NVARCHAR(20),
 [parent] int
)

BEGIN
    INSERT INTO @res

    SELECT product.product_id, product.name, product.type, menuProducts.parent
    FROM tblMenu menu
    JOIN dbo.tblMenu_products menuProducts on menu.menu_id = menuProducts.menu_products_menu
    JOIN dbo.tblProduct product ON menuProducts.menu_products_product = product.product_id
    WHERE menu.menu_id = @menu_id

    insert into @res
        SELECT t.*
        FROM @res r
        CROSS APPLY dbo.fnTest(r.itemId, r.id) AS t
        WHERE r.type = 'product'

 RETURN
END
GO
fnTest
中,我发送产品id的输入参数,并获取该产品的所有项目(儿子、孙子等)

该函数向我显示需要获取的正确项目

现在我需要做的是:
fnListInfo
有一个自动递增的id列。我还有
parentId
,它需要向我显示项目直接父项的自动递增id

fnTest
中设置
parentid
时会出现问题。下面是
fnTest

create function dbo.fnTest(@product_id INT, @autoincrement_id INT) returns @res table(
    [itemId] INT,
    [name] NVARCHAR(255),
    [type] NVARCHAR(20),
    [parent] INT)   
begin   
    ;WITH ret AS(
        SELECT *
        FROM dbo.tblProduct_Ingredients
        WHERE product_ingredient_product = @product_id
        UNION ALL
        SELECT prodIng.*
        FROM dbo.tblProduct_Ingredients AS prodIng
        INNER JOIN ret AS r ON r.product_ingredient_ingredient = prodIng.product_ingredient_product AND r.product_ingredient_table = 'tblProduct'
    )
    insert into @res
        select  ing.ing_id, ing.name, 'ingredient', @autoincrement_id /*parent*/
        FROM ret
        join dbo.tblIng as ing ON ret.product_ingredient_ingredient = ing.ing_id
        WHERE ret.product_ingredient_table = 'tblIng'

        UNION

        SELECT  product.product_id, product.name, 'product', @autoincrement_id /*parent*/
        FROM ret
        join dbo.tblProduct as product ON ret.product_ingredient_ingredient = product.product_id
        WHERE ret.product_ingredient_table = 'tblProduct'
    return
end
GO
问题是,我将父项设置为菜单中产品的项,而不是它们的直接产品父项

比如说,我们有一份“早餐”菜单,菜单上有一个产品“额外煎蛋”,它含有“煎蛋”和配料西红柿。假设“煎蛋饼”的成分是鸡蛋。通过上面的方法,我得到了鸡蛋的
parentId
是'omeletetextra',但我需要得到'Omelette'。我该怎么做