Eu tenho que seguir os dados no SQL Server 2008 R2. SQLFiddle
Esquema:
CREATE TABLE [dbo]. [ICFilters] ( [ICFilterID] [int] IDENTIDADE (1,1) NÃO NULL, [ParentID] [int] NÃO NULL PADRÃO 0, [FilterDesc] [varchar] (50) NÃO NULL, [Ativo] [tinyint] NÃO NULL PADRÃO 1, CONSTRAINT [PK_ICFilters] CHAVE PRIMÁRIA CLUSTERED ([ICFilterID] ASC) COM PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ATIVADO, ALLOW_PAGE_LOCKS = ATIVADO ) ON [PRIMÁRIO] ) ON [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)
Tabela:
| ICFILTERID PARENCIADO 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 do pai e da raiz parentid = 0
. Os FilterDesc
são apenas descrições de amostra, então não posso tentar analisá-las para pedidos.
A questão
É possível selecionar todas as linhas de maneira semelhante a uma árvore? Se sim, como? Quando digo "parecido com 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. Primeira travessia da árvore da 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 PARENCIADO 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 |