Я пытаюсь рекурсивно пройти через спецификацию (BOM) в производственной линии Sage 50 на сервере MS-SQL.
Древовидная структура спецификации содержится в двух таблицах BOMHeader и BOMComponent. Они связаны BOMHeader.ID = BOMComponent.HeaderID. Таким образом, связывая их и запрашивая с помощью определенного BomHeader.BOMReference, я получаю первый уровень спецификации.
Рекурсия возникает из-за того, что каждый BOMComponent сам может быть сборкой, которая имеет StockCode, который, если он существует как BOMHeader.BomReference, указывает, что он является вложенным BOM и имеет подкомпоненты в таблице BOMComponents.
Потратил около получаса на рисование схемы, но выложить не могу так как нужно 10 очков репутации
WITH BOM_CTE (HID, HRef, HDesc, SC, CDesc, CHID, CQ, SEQ)
AS
(
SELECT H.ID as HID, H.BomReference as HRef, H.Description as HDesc, C.StockCode as SC,C.Description as CDesc,C.HeaderID as CHID,C.Quantity as CQ,1 as SEQ
FROM [GNT\SAGEL50].[sagel50_46387].[dbo].BomHeaders H
JOIN [GNT\SAGEL50].[sagel50_46387].[dbo].BomComponents C
ON H.ID = C.HeaderID
WHERE H.BomReference like 'SA000001%'
UNION ALL
SELECT H.ID as HID, H.BomReference as HRef, H.Description as HDesc, C.StockCode as SC,C.Description as CDesc,C.HeaderID as CHID,C.Quantity as CQ,BC.SEQ+1
FROM [GNT\SAGEL50].[sagel50_46387].[dbo].BomHeaders H
JOIN [GNT\SAGEL50].[sagel50_46387].[dbo].BomComponents C
ON H.ID = C.HeaderID
JOIN BOM_CTE BC
ON HRef = BC.SC
)
Select * From BOM_CTE
В приведенном выше коде указан только верхний уровень, и он не будет повторяться, проверяя, появляется ли результирующий код запаса, полученный из таблицы BOMComponents, в таблице BOMHeader как BOMReference (что означает, что он имеет подкомпоненты).
Рекурсия должна завершиться, когда все компоненты BomComponents не имеют ссылки на StockCode в BomHeader.BomReference (это означает, что нет более низкого уровня).
Мне нужен рекурсивный оператор кода SQL, который может выполнить поиск рекурсивного дерева с двумя связанными таблицами. Я просмотрел много вопросов по спецификации, но они, похоже, находятся в одной таблице, а также в двух таблицах CTE, но я не могу понять это, так как я новичок в SQL, особенно в рекурсии.
Заранее благодарю за любую помощь
Адам