Tsql函数返回直接父级的父级ID,而不是祖父级

时间:2015-11-19 09:45:52

标签: tsql

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

我需要做的是:对于一个菜单,列出所有直接和间接项目。这意味着菜单中的所有产品,所有产品和成分,以及所有产品和成分等等。

这是我在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。

parentid中设置fnTest时会出现问题。这里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

问题是我将父级设置为菜单中产品的项目,而不是直接产品父级。

所以,我们说我们有一份菜单'早餐'在其中我有一个产品' Omelette Extra'它的产品是'Omelette'和成分西红柿。让我们说'煎蛋''有成分蛋。通过上面的方法,我得到了鸡蛋的parentId额外的煎蛋,但我需要得到煎蛋卷#39;我该怎么做?

0 个答案:

没有答案