Đệ quy trong sql server

Trong Sql Server 2005, lệnh WITH cho phép ta thực hiện một vòng lặp đệ quy. Việc sử dụng nó trên dữ liệu dạng cây sẽ cho thấy tính tiện dụng của lệnh này.

Cấu trúc dữ liệu dạng cây (cha-con) không xa lạ với những người sử dụng máy tính. Trong Sql Server, ta có thể thiết kế một cách rất đơn giản dạng này.

Như trong hình, ta có nhiều category khác nhau, mỗi cái trong số đó lại có một hoặc nhiều con. Vậy mỗi category, ta sẽ có trường ID và Name, mô tả cho category đó. Còn việc tạo ra mối quan hệ cha con, ta phải thêm vào trường Parent_id, trường này sẽ trỏ tới ID của category mà nó phụ thuộc.

Vấn đề đặt ra là làm sao Select được Level của mỗi phần tử một cách nhanh chóng nhất?

Trước tiên, ta sẽ lấy ra các phần tử Root, là những phần tử trên cùng của cây, có Parent_Id bằng Null, và sẽ có level bằng 0.

Select id, name, 0 as aLevel
From Category
Where parent_id is null

Với các phần tử có level bằng 1 thì phải có Parent_Id bằng với ID của phần tử level 0.
Có nghĩa là, phần tử level thứ n, sẽ có Parent_Id bằng với ID của phần tử level thứ n-1.

Lợi dụng điều này, ta sẽ gọi đệ quy dùng WITH để tính level như sau:

WITH temp(id, name, alevel)
as (
        Select id, name, 0 as aLevel
        From Category
        Where parent_id is null
        Union All 
        Select b.id, b.name, a.alevel + 1
        From temp as a, Category as b
        Where a.id = b.parent_id
)
Select * 
From temp

Khi đó,ta sẽ thu được danh sách category với các level tương ứng.