Производственная линия Sage 50 Спецификация материалов, рекурсивная итерация дерева двух таблиц SQL

Я пытаюсь рекурсивно пройти через спецификацию (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, особенно в рекурсии.

Заранее благодарю за любую помощь

Адам


person Adamgsb    schedule 07.03.2014    source источник
comment
Не могли бы вы дать нам лучшую структуру таблицы? Возможно, используя ascii и код; а затем вопрос о том, что вы пытаетесь сделать? Прямо сейчас это просто читается как стена текста, и трудно понять, что вам нужно.   -  person George Stocker    schedule 07.03.2014
comment
Я отредактировал это, вы можете удалить удержание, пожалуйста   -  person Adamgsb    schedule 08.03.2014
comment
Расширяет ли рекурсия n-уровней или существует ограничение на высоту дерева? (Вы можете жестко закодировать расширение, если ограничение разумно) - PS BOM должен что-то означать? Я продолжаю анализировать метку порядка байтов.   -  person    schedule 08.03.2014
comment
Спецификация — это сокращение от Bill Of Materials, конкретной глубины нет, это зависит от того, как люди создают спецификации, но я подозреваю, что в моем случае глубина не превышает 5 или 6 уровней, но нет предела тому, что я знать о.   -  person Adamgsb    schedule 08.03.2014
comment
Это не имеет ничего общего с шалфеем.   -  person hivert    schedule 09.03.2014


Ответы (2)


В этом потоке есть интересный ответ, и он указывает на более старый поток, показывающий, как выполнить «жестко закодированное» расширение.

mysql recursive(tree) родительская дочерняя категория

person Community    schedule 07.03.2014
comment
Спасибо за ответ, но это не совсем то, что я искал, плюс это только одна таблица, мне нужно две таблицы, и я надеялся сделать это с помощью SQL Recursive CTE. - person Adamgsb; 08.03.2014

WITH BOM_CTE (HID, HRef, HDesc, SC, CDesc, CHID, CQ, SEQ)
AS
(
    --Anchor Member Definition
    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
    --GNT\SAGEL50.[sagel50_35648] refers to a database on a linked server on my main SQL server
    FROM [GNT\SAGEL50].[sagel50_35648].[dbo].BomHeaders H 
    JOIN [GNT\SAGEL50].[sagel50_35648].[dbo].BomComponents C
        ON H.ID = C.HeaderID
    WHERE H.BomReference like 'SA000009%'
    UNION ALL
    --Recursive Member Definition
    SELECT H.ID , H.BomReference f, H.Description , C.StockCode ,C.Description ,C.HeaderID ,C.Quantity, BC.SEQ+1
    FROM [GNT\SAGEL50].[sagel50_35648].[dbo].BomHeaders H 
    JOIN [GNT\SAGEL50].[sagel50_35648].[dbo].BomComponents C
        ON H.ID = C.HeaderID
    JOIN BOM_CTE BC
        ON H.BomReference = BC.SC
)
Select * From BOM_CTE 

Теперь это работает, после того как я удалил псевдонимы, все, что мне нужно сделать, это передать BOMReference, который я хочу выполнить, вместо жестко закодированного «SA000009»%

person Adamgsb    schedule 08.03.2014