Я должен следующие данные в SQL Server 2008 R2. SQLFiddle
Схема:
CREATE TABLE [dbo]. [ICFilters] (
[ICFilterID] [int] IDENTITY (1,1) НЕ NULL,
[ParentID] [int] НЕ NULL ПО УМОЛЧАНИЮ 0,
[FilterDesc] [varchar] (50) NOT NULL,
[Активный] [tinyint] НЕ NULL ПО УМОЛЧАНИЮ 1,
CONSTRAINT [PK_ICFilters] ПЕРВИЧНЫЙ КЛЮЧ КЛАСТЕР
([ICFilterID] ASC) С
PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON
) НА [ПЕРВИЧНО]
) НА [ПЕРВИЧНО]
INSERT INTO [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 | PARENTID | FILTERDESC | ACTIVE | -------------------------------------------------- | 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 | PARENTID | FILTERDESC | ACTIVE | -------------------------------------------------- | 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 |