Я повинен слідкувати за даними в SQL Server 2008 R2. SQLFiddle
Схема:
СТВОРИТИ ТАБЛИЦЮ [dbo]. [ICFilters] ( [ICFilterID] [int] ІДЕНТИЧНІСТЬ (1,1) NOT NULL, [ParentID] [int] NOT NULL DEFAULT 0, [FilterDesc] [varchar] (50) НЕ NULL, [Активний] [крихітний] НЕ ВІДПОВІДНИЙ 1, CONSTRAINT [PK_ICFilters] PRIMARY KEY CLUSTERED ([ICFilterID] ASC) З PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = УВІМКНЕНО, ALLOW_PAGE_LOCKS = УВІМКНЕНО ) ON [ПЕРШИЙ] ) ON [ПЕРШИЙ] ВСТАВИТИ В [dbo]. [ICFilters] (ParentID, FilterDesc, Active) Цінності (0, "Тип продукту", 1), (1, "ProdSubType_1", 1), (1, "ProdSubType_2", 1), (1, "ProdSubType_3", 1), (1, "ProdSubType_4", 1), (2, "PST_1.1", 1), (2, "PST_1.2", 1), (2, "PST_1.3", 1), (2, "PST_1.4", 1), (2, "PST_1.5", 1), (2, "PST_1.6", 1), (2, "PST_1.7", 0), (3, "PST_2.1", 1), (3, "PST_2.2", 0), (3, "PST_2.3", 1), (3, "PST_2.4", 1), (14, "PST_2.2.1", 1), (14, "PST_2.2.2", 1), (14, "PST_2.2.3", 1), (3, "PST_2.8", 1)
Таблиця:
| ICFILTERID | ПАРЕНТИД | FILTERDESC | АКТИВНІ | -------------------------------------------------- | 1 | 0 | Тип продукту | 1 | | 2 | 1 | ProdSubType_1 | 1 | | 3 | 1 | ProdSubType_2 | 1 | | 4 | 1 | ProdSubType_3 | 1 | | 5 | 1 | ProdSubType_4 | 1 | | 6 | 2 | PST_1.1 | 1 | | 7 | 2 | PST_1.2 | 1 | | 8 | 2 | PST_1.3 | 1 | | 9 | 2 | PST_1.4 | 1 | | 10 | 2 | PST_1.5 | 1 | | 11 | 2 | PST_1.6 | 1 | | 12 | 2 | PST_1.7 | 0 | | 13 | 3 | PST_2.1 | 1 | | 14 | 3 | PST_2.2 | 0 | | 15 | 3 | PST_2.3 | 1 | | 16 | 3 | PST_2.4 | 1 | | 17 | 14 | PST_2.2.1 | 1 | | 18 | 14 | PST_2.2.2 | 1 | | 19 | 14 | PST_2.2.3 | 1 | | 20 | 3 | PST_2.8 | 1 |
Кожен рядок має ідентифікатор свого батьківського та кореневого parentid = 0
. Це FilterDesc
лише описи зразків, тому я не можу спробувати розібрати їх для замовлення.
Питання
Чи можна виділити всі рядки у вигляді дерева? Якщо так, то як? Коли я кажу "деревоподібний", я маю на увазі рекурсивно вибирати батьків, за якими слідують усі його діти, потім усі діти кожного з них тощо. Глибина першого обходу дерева.
Ми з Моїми друзями намагалися, але ми не вистачали робочих рішень, але намагаємось продовжувати. Я досить новий в sql, тому, можливо, це можна зробити легко, і я просто роблю речі складніше, ніж потрібно.
Приклад (бажаний) вихід:
| ICFILTERID | ПАРЕНТИД | FILTERDESC | АКТИВНІ | -------------------------------------------------- | 1 | 0 | Тип продукту | 1 | | 2 | 1 | ProdSubType_1 | 1 | | 6 | 2 | PST_1.1 | 1 | | 7 | 2 | PST_1.2 | 1 | | 8 | 2 | PST_1.3 | 1 | | 9 | 2 | PST_1.4 | 1 | | 10 | 2 | PST_1.5 | 1 | | 11 | 2 | PST_1.6 | 1 | | 12 | 2 | PST_1.7 | 0 | | 3 | 1 | ProdSubType_2 | 1 | | 13 | 3 | PST_2.1 | 1 | | 14 | 3 | PST_2.2 | 0 | | 17 | 14 | PST_2.2.1 | 1 | | 18 | 14 | PST_2.2.2 | 1 | | 19 | 14 | PST_2.2.3 | 1 | | 15 | 3 | PST_2.3 | 1 | | 16 | 3 | PST_2.4 | 1 | | 20 | 3 | PST_2.8 | 1 | | 4 | 1 | ProdSubType_3 | 1 | | 5 | 1 | ProdSubType_4 | 1 |