Quelle est la manière la plus simple d'effectuer une auto-jointure récursive dans SQL Server? J'ai une table comme celle-ci:
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
5 YT NULL
6 IS 5
Et je veux pouvoir obtenir les enregistrements uniquement liés à une hiérarchie commençant par une personne spécifique. Donc, si je demandais la hiérarchie de CJ par PersonID = 1, j'obtiendrais:
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
Et pour les EB, j'aurais:
PersonID | Initials | ParentID
2 EB 1
4 SW 2
Je suis un peu coincé sur ce point, je ne peux pas penser comment le faire en dehors d'une réponse à profondeur fixe basée sur un tas de jointures. Cela ferait comme cela se passe parce que nous n'aurons pas beaucoup de niveaux, mais je voudrais le faire correctement.
Merci! Chris.
Réponses:
En ajoutant la condition de commande, vous pouvez conserver l'ordre de l'arborescence:
En modifiant la
ORDER BY
condition, vous pouvez modifier l'ordre des frères et sœurs.la source
PersonID = theIdYouAreLookingFor
place deParentID IS NULL
.WITH
clause. Si vous avez besoin de détails, veuillez créer un violon sur sqlfiddle.com et publier le lien ici.En utilisant les CTE, vous pouvez le faire de cette façon
la source
La requête Quassnoi avec un changement pour une grande table. Parents avec plus d'enfants que 10: Formater en str (5) le row_number ()
la source
SQL 2005 ou version ultérieure, les CTE sont la méthode standard à suivre selon les exemples présentés.
SQL 2000, vous pouvez le faire en utilisant des UDF -
(qui fonctionnera en 2005, ce n'est tout simplement pas la manière standard de le faire. Cela dit, si vous trouvez que c'est la manière la plus simple de travailler, exécutez-la)
Si vous avez vraiment besoin de faire cela dans SQL7, vous pouvez faire à peu près ce qui précède dans un sproc mais vous ne pouvez pas en sélectionner - SQL7 ne prend pas en charge les UDF.
la source
Vérifiez ce qui suit pour vous aider à comprendre le concept de récursivité CTE
la source