Das Problem ist, dass Sie nicht wirklich mit strengen Hierarchien zu tun; Sie haben es mit gerichteten Graphen zu tun, in denen einige Graphen Zyklen haben. Beachten Sie, dass Ihre nbgroup # 1 keine kanonische Wurzel hat - sie könnte a, b oder c aufgrund der zyklischen Referenz von c-a sein.
Der grundlegende Weg, damit umzugehen, ist in Graphtechniken zu denken, nicht in Rekursion. In der Tat ist ein iterativer Ansatz (ohne Verwendung eines CTE) die einzige Lösung, die ich mir in SQL vorstellen kann. Der grundlegende Ansatz ist explained here.
Here is a SQL Fiddle mit einer Lösung, die sowohl die Zyklen als auch den gemeinsamen Blattfall anspricht. Beachten Sie, dass es eine Iteration (mit einer Failsafe-Funktion zum Verhindern von Runaway-Prozessen) und Tabellenvariablen verwendet; Ich denke nicht, dass da irgendwas passiert. Beachten Sie auch die geänderten Probendaten (a-g wurde in a-h geändert; siehe unten).
Wenn Sie sich in SQL vertiefen, werden Sie bemerken, dass ich einige wichtige Dinge von der Lösung geändert habe, die in dem Link angegeben ist. Diese Lösung hat sich mit ungerichteten Kanten beschäftigt, während Ihre Kanten gerichtet sind (wenn Sie ungerichtete Kanten verwendet haben, ist der gesamte Probensatz wegen der a-g-Verbindung eine einzelne Komponente).
Dies führt zu dem Grund, warum ich a-g zu a-h in meinen Beispieldaten geändert habe. Ihre Spezifikation des Problems ist einfach, wenn nur Blattknoten gemeinsam genutzt werden. Das ist die Spezifikation, die ich programmiert habe. In diesem Fall können a-h und g-h beide problemlos zu ihren richtigen Komponenten gebündelt werden, da wir uns Sorgen um die Erreichbarkeit von den Eltern machen (selbst bei bestimmten Zyklen).
Wenn Sie jedoch Zweige geteilt haben, ist nicht klar, was Sie anzeigen möchten. Betrachten Sie die a-g-Verknüpfung: Gegeben davon könnte g-h in jeder Komponente (a-g-h oder f-g-h) existieren. Du hast es in die Sekunde gelegt, aber es könnte stattdessen in der ersten sein, oder? Diese Zweideutigkeit ist der Grund, warum ich nicht versucht habe, es in dieser Lösung anzusprechen.
Edit: Um klar zu sein, in meiner obigen Lösung, wenn Shared braches angetroffen werden, behandelt es den gesamten Satz als eine einzelne Komponente. Nicht das, was Sie oben beschrieben haben, aber es muss geändert werden, nachdem das Problem geklärt ist. Hoffentlich kommt dir das nahe.
Update: Problem mit unendlicher Rekursion –
Was bedeutet "Endlosschleife" bedeuten? Dass es keine theoretische Grenze für die Hierarchie gibt? Oder, dass die Hierarchie zu einem bestimmten Zeitpunkt so läuft, dass es in einigen Zweigen buchstäblich keinen kinderlosen Knoten gibt? --Bearbeiten: Sieht so aus wie das Letzte, also was willst du passieren, wenn du eine Schleife erreichst? –
weil ein Elternteil in einigen Fällen ein Kind sein kann –