这是我的数据库的结构:我有一个表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;我该怎么做?