Я работаю над системой, где у меня есть рецепт. РецептItem - это то, что завершает этот рецепт. CraftMaterials - это компоненты, которые необходимо комбинировать для завершения рецепта.Рекурсивный запрос CTE
CREATE TABLE Recipe
(
RecipeId bigint
...other data
)
CREATE TABLE CraftMaterial
(
CraftMaterialId bigint,
ItemId bigint,
RecipeId bigint,
Amount int
)
CREATE TABLE RecipeItem
(
RecipeItemId bigint
RecipeId bigint,
ItemId bigint,
Amount int
)
CREATE TABLE Item
(
ItemId bigint
Name varchar(200)
IconName varchar(200)
)
Когда вы делаете присоединиться Рецепт -> RecipeItem -> Item, вы получаете Hte имя элемента рецепт делает. В элементе рецепта хранится, сколько из этого элемента создано.
Когда вы присоединяетесь к рецепту -> CraftMaterial -> Item, вы получаете список предметов, которые объединены, чтобы сделать этот рецепт.
Материал (и) рецепта может быть самим рецептом.
Что я хочу сделать, это использовать CTE для получения материалов на каждом уровне конструкции до тех пор, пока я не дойду до базовых элементов - это элемент в CraftMaterial не имеет соответствующей записи в RecipeItem.
То, что я до сих пор правильно выбрал рецепт первого уровня. Это рекурсивная часть запроса, которая вызывает у меня проблемы.
DECLARE @RecipeId int
SET @RecipeId = 5951
;WITH cteMaterials (CCraftMatId, ItId, RecId, Amt, Name, Icon, MatLevel)
AS
(
SELECT
cm.CraftMaterialId,
cm.ItemId,
cm.RecipeId,
cm.Amount,
i.Name,
i.IconFileName,
1
FROM CraftMaterial cm
JOIN Item i ON cm.ItemId = i.ItemId
WHERE cm.RecipeId = @RecipeId
UNION ALL
???
)
select * from cteMaterials
почему не Recipe держать имя? что вы получаете из таблицы предметов? –
Можете ли вы предоставить некоторые данные образца? – SouravA