Eu tenho uma tabela no meu banco de dados SQL Server com dados como este:
ID ParentID
--- ---------
1 NULL
2 1
3 1
5 1
5 4
5 6
8 6
7 9
9 10
Eu preciso de uma select
instrução que retorne todas as linhas que tenham alguma relação entre elas (não importa pai ou filho). Por exemplo, para id
= 1, preciso obter todas as linhas, exceto as duas últimas. O mesmo resultado deve ser para id
= 2, 3, 4, 5, 6 ,8. E para id
= 7 ou 9 a instrução deve retornar apenas as duas últimas linhas. Tentei resolver esse problema com CTE recursivo, mas falhei.
Também não sou muito bom com recursão, então não se sinta mal. Eu tive sucesso com estruturas semelhantes às seguintes. Não é elegante, mas você pode ver exatamente o que está acontecendo. Basicamente, você precisa reunir todos os valores possíveis para avaliar em relação a ID e ParentID para um determinado valor de ParentID. Esta solução assume valores inteiros. Vai ficar um pouco mais complicado com valores alfanuméricos. O bom disso é que você pode executá-lo como está ou modificá-lo para exibir uma ordem hierárquica.