Eu tenho que seguir os dados no SQL Server 2008 R2. SQLFiddle
Esquema:
CRIAR TABELA [dbo].[ICFilters]( [ICFilterID] [int] IDENTITY(1,1) NOT NULL, [ParentID] [int] NÃO NULO PADRÃO 0, [FilterDesc] [varchar](50) NÃO NULO, [Ativo] [tinyint] NÃO NULO PADRÃO 1, CONSTRAINT [PK_ICFilters] CHAVE PRIMÁRIA CLUSTERED ( [ICFilterID] ASC ) COM PAD_INDEX = DESLIGADO, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = DESLIGADO, ALLOW_ROW_LOCKS = ATIVADO, ALLOW_PAGE_LOCKS = ATIVADO ) EM [PRIMÁRIO] ) EM [PRIMÁRIO] INSERT INTO [dbo].[ICFilters] (ParentID,FilterDesc,Active) Valores (0,'Tipo de produto',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)
Mesa:
| ICFILTERID | PARENTID | FILTERDESC | ATIVO | -------------------------------------------------- | 1 | 0 | Tipo de produto | 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 |
Cada linha tem o ID de seu pai e o parentid = 0
. Os FilterDesc
s são apenas descrições de amostra, então não posso tentar analisá-los para fazer o pedido.
A questão
É possível selecionar todas as linhas de maneira semelhante a uma árvore? Se sim, como? Quando digo 'semelhante a uma árvore', quero dizer selecionar recursivamente o pai seguido por todos os seus filhos, depois todos os filhos de cada um deles e assim por diante. Uma travessia da primeira árvore de profundidade.
Meus amigos e eu tentamos, mas ficamos aquém das soluções de trabalho, mas continuaremos tentando. Eu sou bastante novo no sql, então talvez isso possa ser feito facilmente e estou apenas tornando as coisas mais difíceis do que o necessário.
Exemplo de saída (desejada):
| ICFILTERID | PARENTID | FILTERDESC | ATIVO | -------------------------------------------------- | 1 | 0 | Tipo de produto | 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 |