Tôi có một bảng nhưLàm thế nào tôi có thể viết một thủ tục được cấp i qua j hoặc một cây như thế này?
Users
-------------------------
id | ancestor_id | ....
-------------------------
1 | NULL | ....
2 | 1 | ....
3 | 1 | ....
4 | 3 | ....
5 | 3 | ....
đó sẽ đại diện cho một cây như
level 1 1
/\
level 2 2 3
/\
level 3 4 5
và tôi muốn tạo một thủ tục mà trả về thứ i
qua thế hệ thứ j
của hậu duệ của một người sử dụng đưa ra:
CREATE PROCEDURE DescendantsLevel
@user_id INT,
@i INT,
@j INT
AS
....
Nếu @j
là NULL
, tuy nhiên, nó trả về tất cả các con cháu bắt đầu từ thế hệ @i
.
Ví dụ:
EXEC DescendantLevel @user_id=1,@i=2,@j=NULL
sẽ trở
-------------------------
id | ancestor_id | ....
-------------------------
1 | NULL | ....
2 | 1 | ....
3 | 1 | ....
4 | 3 | ....
5 | 3 | ....
và
EXEC DescendantLevel @user_id=1,@i=1,@j=2
sẽ trở
Users
-------------------------
id | ancestor_id | ....
-------------------------
1 | NULL | ....
2 | 1 | ....
3 | 1 | ....
Một số câu hỏi, tôi có:
- Có một giá trị tốt hơn so với
NULL
để đại diện cho một số khái niệm về "vô cực" trong SQL? - Làm cách nào để triển khai quy trình tôi đã mô tả?
- Có cách nào tốt hơn để thiết kế cơ sở dữ liệu để đơn giản hóa quy trình không?
Tra cứu các byte đệ quy. Đây sẽ là cách dễ nhất để giải quyết vấn đề này nếu bạn sử dụng thiết kế này. Bạn cũng có thể xem mô hình tập hợp lồng nhau như là một lựa chọn tốt hơn cho danh sách kề. –
Nếu '@ i' là 2 trong ví dụ đầu tiên của bạn thì tại sao id # 1 được trả về? –
Tại sao không thêm cột cấp? Làm cho truy vấn thực sự đơn giản. – maraca