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 |
fonte
Respostas:
OK, células cerebrais suficientes estão mortas.
SQL Fiddle
fonte
[FilterDesc]
coluna são fictícios e essa ordem é desnecessária / sem importância. Seguindo a lógica da resposta de Travis Gan, tudo o que você deve fazer para obter essa ordem é adicionar outraCAST
àLevel
. por exemplo.Level + CAST( CAST(i.[ICFilterID] AS varbinary(max)) AS Level
Torna-seLevel + CAST(i.[FilterDesc] AS varbinary(max)) + CAST(i.[ICFilterID] AS varbinary(max)) AS Level
.O acima exposto não parece funcionar corretamente para mim. Imagine uma configuração de 2 tabelas com dados do tipo facebook. A Tabela 1 apresenta PostId + outros campos. PostId é incremento automático e, obviamente, em sua interface, você classificará DESC para ter a última publicação no topo.
Agora, para a tabela de comentários. Tabela 2 Esta tabela CommentId é a chave primária, número automático. No seu GUI, você deseja exibi-lo em ASC, para que ao ler o tópico, faça sentido. (mais antigo (número menor) na parte superior) Outras chaves importantes na tabela 2 são: PostId (FK de volta às postagens) e ParentId (FK de CommentId), em que ParentId será NULL se esse for o comentário "raiz" em uma postagem. Se alguém responder a um comentário, o parentId será preenchido com o commentid.
Espero que vocês entendam. O CTE ficará assim:
Saída de amostra
Na publicação F / B 105, houve dois comentários (CommentIds 1 e 2). Alguém respondeu no Comment1 (CommentId 5, ParentId 1) e depois alguém comentou sobre essa resposta, assim como no Comment5 (CommentId 6, ParentId 6).
E viola, a sequência está correta. No post, agora você pode mostrar os comentários na sequência correta. Para recuar as postagens de forma que elas se formem e contornem como no facebook (quanto mais fundo o nível, mais ele deve ter margens da esquerda), também tenho uma coluna chamada Recuo. As raízes são 0 e, em seguida, na união, temos c.Indent + 1 AS Indent No código, agora você pode multiplicar o indent por vamos assumir 32px e mostrar os comentários em uma boa hierarquia e estrutura de tópicos.
Não vejo problema em usar a chave primária de incremento automático CommentId como a força motriz para criar minha SortKey, pois há uma mudança melhor nas datas que você bagunça (data do comentário) do que bagunçar uma chave gerenciada do banco de dados que semeia +1
fonte
Isso lhe dará todos os descendentes e o nível.
Espero que isto ajude :)
fonte