5
I veSeviye j veya i gibi bir ağacı nasıl alacak bir prosedür yazabilirim?
level 1 1
/\
level 2 2 3
/\
level 3 4 5
gibi bir ağaç temsil edecek
Users
-------------------------
id | ancestor_id | ....
-------------------------
1 | NULL | ....
2 | 1 | ....
3 | 1 | ....
4 | 3 | ....
5 | 3 | ....
gibi bir tablo Ben belirli bir kullanıcının soyundan j
inci nesil yoluyla i
th döndüren bir yordamı oluşturmak istiyor vardır: @j
NULL
olduğunu
CREATE PROCEDURE DescendantsLevel
@user_id INT,
@i INT,
@j INT
AS
....
Ancak, döndürdüğü @i
'dan başlayan tüm torunlar.
Örnekler:
EXEC DescendantLevel @user_id=1,@i=2,@j=NULL
dönmek
-------------------------
id | ancestor_id | ....
-------------------------
1 | NULL | ....
2 | 1 | ....
3 | 1 | ....
4 | 3 | ....
5 | 3 | ....
ve
EXEC DescendantLevel @user_id=1,@i=1,@j=2
dönmek
Users
-------------------------
id | ancestor_id | ....
-------------------------
1 | NULL | ....
2 | 1 | ....
3 | 1 | ....
Çeşitli sorular, var:
- SQL "sonsuz" bazı kavramı temsil etmek
NULL
daha iyi bir değeri var mı? - Açıkladığım prosedürü nasıl uygularım?
- Prosedürü basitleştirmek için veritabanını tasarlamanın daha iyi bir yolu var mı? Bir özyinelemeli CTE Kullanarak
Arama yinelenen ctes. Bu tasarımı kullanırsanız bunu çözmenin en kolay yolu olacaktır. Ayrıca iç içe geçmiş kümeler modeline bitişik listeye daha iyi bir alternatif olarak bakabilirsin. –
Eğer ilk örneğinizde 'i' 2 ise, neden # 1 geri gönderiliyor? –
Neden bir seviye sütunu eklemiyorsunuz? Sorguyu gerçekten basitleştirir. – maraca