Comment puis-je générer une hiérarchie chemin dans SQL qui conduit à un nœud donné?
Dans mon MS SQL 2008 R2 base de données, j'ai ce tableau:
TABLE [Hierarchy]
[ParentCategoryId] [uniqueidentifier] NULL,
[ChildCategoryId] [uniqueidentifier] NOT NULL
J'ai besoin d'écrire une requête qui va générer tous les chemins qui mènent à un Nœud donné.
Permet de dire ça, j'ai l'arbre suivant:
A
-B
--C
-D
--C
Qui est stockée en tant que:
NULL | A
A | B
A | D
B | C
D | C
Lors de la demande de Chemins pour le C, je voudrais revenir deux chemins (écrit plus ou moins comme ceci):
A > B > C,
A > D > C
La version de SQL Server que vous utilisez? Le mot-clé de recherche que vous êtes à la recherche pour des Requêtes Hiérarchiques. Je ne suis pas trop familier avec SQLServer, mais ce serait une tâche triviale dans Oracle à l'aide de la
Ah, j'ai oublié de mentionner la version, je vais l'ajouter à la question, mais c'est MS SQL 2008 R2
Découvrez de table commune récursive des expressions ou tout simplement des requêtes récursives. Il y a des tonnes d'exemple ici sur DONC
Côté bar; Essayé de deviner pourquoi vous voulez savoir tous les parcours disponibles entre les nœuds. Deviné, c'était peut-être de sorte que vous pouvez calculer le chemin le plus court. Si c'est le cas: l'Algorithme de Dijkstra
connect by
et start with
opérateurs, et comme je sais que les nouvelles versions de sql server ont déjà la plupart des fonctionnalités que l'Oracle aAh, j'ai oublié de mentionner la version, je vais l'ajouter à la question, mais c'est MS SQL 2008 R2
Découvrez de table commune récursive des expressions ou tout simplement des requêtes récursives. Il y a des tonnes d'exemple ici sur DONC
Côté bar; Essayé de deviner pourquoi vous voulez savoir tous les parcours disponibles entre les nœuds. Deviné, c'était peut-être de sorte que vous pouvez calculer le chemin le plus court. Si c'est le cas: l'Algorithme de Dijkstra
OriginalL'auteur Dugan | 2013-01-09
Vous devez vous connecter pour publier un commentaire.
Voici ma solution, Sql Violon
De sortie:
Mise à JOUR:
@AlexeiMalashkevich, pour obtenir l'id, vous pouvez essayer cette
SQL Violon
Peut-être vous avez des solution pour obtenir un seul chemin de l'id au lieu du chemin? Bien sûr, je peux l'analyser, mais peut etre qu'il y a de plus beau solution?
pourriez-vous nous donner un exemple de votre sortie désirée?
Assurez-vous. Pour l'exemple précédent, il devrait être de 4 lignes 'A' 'D' 'B' 'C'.
Réponse de mise à jour.
OriginalL'auteur EricZ
Solution Possible est d'utiliser l'expression de table commune récursive, comme mentionné par @a_horse_with_no_name:
Merci, bon point et le lien, je suis d'accord.
Cela permettrait d'exclure de haut niveau des parents sans enfants et aurait besoin d'un peu de manipulation pour rendre compte de l'utilisation de uniqueidentifiers que le tableau des types de données, mais la logique générale est la même que ma réponse. Vous me battre pour la réponse en trois minutes, bravo. 🙂
oui, vous avez raison, ce n'est pas la solution parfaite, mais juste comme un exemple de l'auteur. 3 minutes, c'est comme l'éternité - votre Serveur SQL a effectué milliards d'opérations pendant ce temps 🙂
OriginalL'auteur Oleksandr Kucher
C'est une intéressante structure de la hiérarchie. Semble permettre aux parents éventuellement être les enfants de leurs enfants. Si cela devait arriver ce code logique allait se briser, mais tant que ce n'est pas se produire cela devrait fonctionner.
OriginalL'auteur Eric J. Price