Как я могу получить рекурсивные данные из таблиц спецификаций - PullRequest
3 голосов
/ 10 сентября 2010

Это в SQL Server 2008.

Я планирую создать две таблицы для представления спецификации. Основные записи будут иметь следующие данные: -

[ID] [Код товара] [Описание товара]

1 ---- A001 ---- Сборка 1
2 ---- B001 ---- Sub Assembly 1 (Child of Assembly 1)
3 ---- B002 ---- Sub Assembly 2 (Child of Assembly 1)
4 ---- C001 ---- Компонент 1 (дочерний элемент подсборки 1)
5 ---- C002 ---- Компонент 2 (дочерний элемент подсборки 2)

Таблица отношений спецификации будет иметь следующие данные. [ID родительского элемента] и [ID дочернего элемента] являются внешними ключами для основной записи элемента. : -

[ID] [ID родительского элемента] [ID дочернего элемента]

1 ---- 1 ---- 2
2 ---- 1 ---- 3
3 ---- 2 ---- 4
4 ---- 3 ---- 5

Таким образом, в первой таблице содержатся только сами элементы, а в другой таблице - отношения, определяющие, какой родительский идентификатор имеет какие дочерние элементы.

Каким может быть SQL для извлечения всех дочерних элементов для сборки (A001), учитывая тот факт, что может потребоваться рекурсивная итерация в зависимости от данных, добавленных в таблицы выше?

Так что для приведенных выше данных, я должен получить вывод следующим образом: -

1) A001

                1.1) B001       
                               1.1.1)C001      
                1.2) B002         
                               1.2.1) C002  

Спасибо, Чак.

Ответы [ 2 ]

2 голосов
/ 10 сентября 2010

Используйте рекурсивный CTE . Например:

WITH BomTree (ID, Level, [Item Code], [Item Description], Depth)
AS
(
-- Anchor member definition
    SELECT m.*, 0 AS Depth
    FROM dbo.Master AS m
    WHERE m.[ID] = ?
    UNION ALL
-- Recursive member definition
    SELECT m.*, t.Depth + 1 AS Depth
    FROM dbo.Master AS m
    INNER JOIN dbo.BOM AS b
        ON m.[ID] = b.[Child Item ID]
    INNER JOIN BomTree AS t
        ON b.[Parent Item ID] = t.ID
)
-- Statement that executes the CTE
SELECT * FROM BomTree; 
1 голос
/ 10 сентября 2010

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

В SQL Server 2008 также есть тип иерархии , который может упростить задачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...