Ich habe eine Tabelle in SQL Server, die die normale Baumstruktur von Item_ID, Item_ParentID hat. Angenommen, ich möchte alle CHILDREN einer bestimmten Item_ID (auf jeder Ebene) durchlaufen und erhalten.
Rekursion scheint ein intuitiver Kandidat für dieses Problem zu sein, und ich kann eine SQL Server-Funktion schreiben, um dies zu tun.
Beeinflusst dies die Leistung, wenn meine Tabelle viele Datensätze enthält? Wie vermeide ich Rekursion und frage einfach die Tabelle ab? Bitte irgendwelche Vorschläge?
Mit dem neuen MS SQL 2005 könnten Sie das WITH
Schlüsselwort
Sehen Sie sich diese Frage
Mit Oracle könnten Sie das Schlüsselwort CONNECT BY
verwenden, um hierarchische Abfragen zu generieren ( Syntax ).
AFAIK mit MySQL müssen Sie die Rekursion verwenden.
Alternativ könnten Sie immer eine Cache-Tabelle für Ihre Datensätze Eltern- & gt; Kind-Beziehungen
erstellenAls eine allgemeine Antwort ist es möglich, ziemlich komplizierte Dinge in SQL Server zu tun, die normalerweise Rekursion benötigen, einfach durch Verwendung eines iterativen Algorithmus. Es gelang mir, einen XHTML-Parser in Transact SQL zu erstellen, der erstaunlich gut funktionierte. Der Code-Prettifier, den ich geschrieben habe, wurde in einer gespeicherten Prozedur ausgeführt. Es ist nicht elegant, es ist eher, als würde man Büffel beim Ballet spielen sehen. aber es funktioniert.
Das Problem, auf das Sie bei der Rekursion und der Leistung stoßen, ist, wie oft es sich wiederholen muss, um die Ergebnisse zurückzugeben. Jeder rekursive Aufruf ist ein weiterer separater Aufruf, der zu den Gesamtergebnissen hinzugefügt werden muss.
In SQL 2k5 können Sie einen gemeinsamen Tabellenausdruck verwenden, um diese Rekursion zu behandeln:
%Vor%oder eine andere Lösung besteht darin, die Hierarchie in eine andere Tabelle zu reduzieren
Mitarbeiter_Manager
ManagerId (PK, FK zu Employee-Tabelle)
EmployeeId (PK, FK zu Employee-Tabelle)
Alle übergeordneten untergeordneten Beziehungen werden in dieser Tabelle gespeichert. Wenn also Manager 1 Manager 2 verwaltet, wird Mitarbeiter 3 verwaltet. Die Tabelle sieht folgendermaßen aus:
%Vor%Damit kann die Hierarchie leicht abgefragt werden:
%Vor%Dies würde alle Mitarbeiter zurückgeben, die Manager 42 haben. Der Vorteil ist eine höhere Leistung, aber die Hierarchie wird beibehalten.
Joe Celko hat ein Buch (& lt; - Link zu Amazon) speziell auf Baumstrukturen in SQL-Datenbanken. Während Sie für Ihr Modell eine Rekursion benötigen würden und dort durchaus ein Potenzial für Performance-Probleme bestünde, gibt es alternative Möglichkeiten, eine Baumstruktur zu modellieren, abhängig davon, was Ihr spezifisches Problem beinhaltet, was Rekursion vermeiden und eine bessere Performance ermöglichen könnte.
Vielleicht ist mehr Detail in Ordnung.
Wenn Sie eine Master-Detail-Beziehung haben, wie Sie beschreiben, wird dann nicht ein einfacher JOIN bekommen, was Sie brauchen?
Wie in:
%Vor%Tags und Links sql-server recursion