Façon la plus simple de faire un appel récursif à l'auto-jointure?
Quelle est la façon la plus simple de faire un appel récursif à l'auto-jointure dans SQL Server? J'ai un tableau comme ceci:
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
5 YT NULL
6 IS 5
Et je veux être en mesure d'obtenir les enregistrements uniquement liée à une hiérarchie qui commence avec une personne en particulier. Donc, Si j'ai demandé à CJ de la hiérarchie par PersonID=1 je voudrais obtenir:
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
Et de l'EB est que j'aimerais obtenir:
PersonID | Initials | ParentID
2 EB 1
4 SW 2
Je suis un peu coincé sur ce peut ne peut pas penser comment le faire en dehors d'une profondeur fixe de réponse basé sur un tas de jointures. Ce serait faire comme cela arrive parce que nous n'aurons pas beaucoup de niveaux, mais je voudrais le faire correctement.
Merci! Chris.
- La version de SQL Server que vous utilisez? c'est à dire Sql server 2000, 2005, 2008?
- DONC, les questions concernant les requêtes récursives: stackoverflow.com/search?q=sql-server+recursive
Vous devez vous connecter pour publier un commentaire.
Par l'ajout de l'état de la commande, vous pouvez conserver l'arbre de commande:
Par la modification de la
ORDER BY
condition que vous pouvez modifier l'ordre des frères et sœurs.PersonID = theIdYouAreLookingFor
au lieu deParentID IS NULL
.WITH
clause. Si vous avez besoin de précisions, veuillez créer un violon sur sqlfiddle.com et poster le lien ici.À l'aide d'expressions de table communes, vous pouvez le faire de cette façon
La Quassnoi requête avec une grande table. Les Parents ayant plus d'enfant à 10: Formatage str(5) la fonction row_number()
SQL 2005 ou plus tard, d'expressions de table communes sont le chemin à parcourir par les exemples présentés.
SQL server 2000, vous pouvez le faire en utilisant Udf -
(qui travaillera en 2005, c'est juste pas la façon habituelle de faire. Cela dit, si vous trouvez que la façon la plus facile de travailler avec elle)
Si vous avez vraiment besoin de faire cela dans SQL7, vous pouvez faire à peu près la ci-dessus dans une procédure stockée, mais ne pouvait pas sélectionner à partir d'elle - SQL7 ne supporte pas les fonctions définies par l'utilisateur.
Vérifiez les points suivants afin d'aider à comprendre le concept de la CTE, la récursivité