Qual é a maneira mais simples de fazer uma autojunção recursiva no SQL Server? Eu tenho uma mesa assim:
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
5 YT NULL
6 IS 5
E eu quero ser capaz de obter os registros relacionados apenas a uma hierarquia começando com uma pessoa específica. Portanto, se eu solicitasse a hierarquia de CJ por PersonID = 1, eu obteria:
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
E para EBs eu obteria:
PersonID | Initials | ParentID
2 EB 1
4 SW 2
Estou um pouco preso nisso, não consigo pensar em como fazer isso sem uma resposta de profundidade fixa baseada em um monte de junções. Isso aconteceria como acontece porque não teremos muitos níveis, mas eu gostaria de fazê-lo corretamente.
Obrigado! Chris.
Respostas:
Ao adicionar a condição de pedido, você pode preservar a ordem da árvore:
Ao alterar a
ORDER BY
condição, você pode alterar a ordem dos irmãos.fonte
PersonID = theIdYouAreLookingFor
vez deParentID IS NULL
.WITH
cláusula. Se precisar de detalhes, crie um violino em sqlfiddle.com e poste o link aqui.Usando CTEs, você pode fazer isso desta maneira
fonte
A consulta Quassnoi com uma mudança para uma mesa grande. Pais com mais filhos do que 10: formatando como str (5) o row_number ()
fonte
SQL 2005 ou posterior, CTEs são a maneira padrão de seguir os exemplos mostrados.
SQL 2000, você pode fazer isso usando UDFs -
(que funcionará em 2005, mas não é a maneira padrão de fazer isso. Dito isso, se você achar que é a maneira mais fácil de trabalhar, use-a)
Se você realmente precisa fazer isso no SQL7, pode fazer aproximadamente o acima em um sproc, mas não pode selecionar a partir dele - o SQL7 não oferece suporte a UDFs.
fonte
Verifique a seguir para ajudar a entender o conceito de recursão CTE
fonte