Ho una tabella comeCome posso scrivere una procedura che ottiene i livelli da I a J o un albero come questo?
Users
-------------------------
id | ancestor_id | ....
-------------------------
1 | NULL | ....
2 | 1 | ....
3 | 1 | ....
4 | 3 | ....
5 | 3 | ....
che rappresentasse un albero come
level 1 1
/\
level 2 2 3
/\
level 3 4 5
e voglio creare una procedura che restituisce il i
° attraverso j
° generazione di discendenti di un dato utente:
CREATE PROCEDURE DescendantsLevel
@user_id INT,
@i INT,
@j INT
AS
....
Se @j
è NULL
, però, restituisce tutti i discendenti a partire dalla generazione @i
.
Esempi:
EXEC DescendantLevel @user_id=1,@i=2,@j=NULL
sarebbe tornato
-------------------------
id | ancestor_id | ....
-------------------------
1 | NULL | ....
2 | 1 | ....
3 | 1 | ....
4 | 3 | ....
5 | 3 | ....
e
EXEC DescendantLevel @user_id=1,@i=1,@j=2
sarebbe tornato
Users
-------------------------
id | ancestor_id | ....
-------------------------
1 | NULL | ....
2 | 1 | ....
3 | 1 | ....
Molte domande, ho:
- C'è un valore migliore rispetto
NULL
per rappresentare qualche concetto di "infinito" in SQL? - Come posso implementare la procedura che ho descritto?
- Esiste un modo migliore per progettare il database al fine di semplificare la procedura?
Ricerca di codici ricorsivi. Sarà il modo più semplice per risolvere questo problema se utilizzi questo design. Si potrebbe anche considerare il modello di insiemi nidificati come un'alternativa migliore all'elenco di adiacenza. –
Se '@ i' è 2 nel tuo primo esempio, perché viene restituito l'id # 1? –
Perché non aggiungere una colonna di livello? Rende la query davvero semplice. – maraca