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'。我该怎么做