Ich habe eine Tabelle wieWie kann ich eine Prozedur schreiben, die Ebenen i bis j oder einen Baum wie folgt bekommt?
Users
-------------------------
id | ancestor_id | ....
-------------------------
1 | NULL | ....
2 | 1 | ....
3 | 1 | ....
4 | 3 | ....
5 | 3 | ....
die einen Baum wie
level 1 1
/\
level 2 2 3
/\
level 3 4 5
und ich möchte erstellen ein Verfahren, das gibt den i
ten bis j
ten Generation von Nachkommen eines bestimmten Benutzers darstellen würde:
CREATE PROCEDURE DescendantsLevel
@user_id INT,
@i INT,
@j INT
AS
....
Wenn @j
NULL
ist es jedoch wieder alle Nachkommen beginnend mit der Generation @i
.
Beispiele:
EXEC DescendantLevel @user_id=1,@i=2,@j=NULL
-------------------------
id | ancestor_id | ....
-------------------------
1 | NULL | ....
2 | 1 | ....
3 | 1 | ....
4 | 3 | ....
5 | 3 | ....
und
EXEC DescendantLevel @user_id=1,@i=1,@j=2
zurückkehren würde zurückkehren würde
Users
-------------------------
id | ancestor_id | ....
-------------------------
1 | NULL | ....
2 | 1 | ....
3 | 1 | ....
Mehrere Fragen, die ich habe:
- Gibt es einen besseren Wert als
NULL
in SQL einige Konzepte der „Unendlichkeit“ zu vertreten? - Wie kann ich das beschriebene Verfahren implementieren?
- Gibt es eine bessere Möglichkeit, die Datenbank zu entwerfen, um das Verfahren zu vereinfachen?
Suche rekursive Ctes. Es ist der einfachste Weg, dies zu lösen, wenn Sie dieses Design verwenden. Sie können sich auch das Modell der verschachtelten Mengen als bessere Alternative zur Adjazenzliste ansehen. –
Wenn '@ i 'in Ihrem ersten Beispiel 2 ist, warum wird ID # 1 zurückgegeben? –
Warum nicht eine Level-Spalte hinzufügen? Macht die Abfrage wirklich einfach. – maraca