2010-10-15 38 views
9

Câu hỏi: Tôi có một cái nhìn mà tôi muốn lấy từ một truy vấn đệ quy.SQL: Cách tạo chế độ xem từ truy vấn đệ quy?

Truy vấn là về cấu trúc tương tự như cái này ở đây: http://forums.asp.net/t/1207101.aspx

Và đại diện cho một treeview như một bộ dữ liệu ra lệnh.

Làm thế nào tôi có thể tạo ra một cái nhìn mà thực hiện điều này:

;WITH Tree (ID, [NAME], PARENT_ID, Depth, Sort) AS 
(
    SELECT ID, [NAME], PARENT_ID, 0 AS Depth, CONVERT(varchar(255), [Name]) AS Sort FROM Category 
    WHERE PARENT_ID = 0 
    UNION ALL 
    SELECT CT.ID, CT.[NAME], CT.PARENT_ID, Parent.Depth + 1 AS Depth, 
    CONVERT(varchar(255), Parent.Sort + ' | ' + CT.[NAME]) AS Sort 
    FROM Category CT 
    INNER JOIN Tree as Parent ON Parent.ID = CT.PARENT_ID 
) 

-- HERE IS YOUR TREE, Depths gives you the level starting with 0 and Sort is the Name based path 
SELECT ID, [NAME], PARENT_ID, Depth, Sort FROM Tree 
ORDER BY Sort 
+1

Bạn có thể được tốt hơn tạo ra một inline Bảng Function Quý mà thực hiện điều này. Sau đó, bạn có thể parameterise Parent_Id mà bạn vượt qua nó. –

+1

Sẽ tốt hơn nếu bạn làm điều đó trong chế độ xem và có thể thêm uid gốc chính làm cột và truy vấn xem từ quy trình được lưu trữ. Các hàm bảng có giá trị sẽ trở nên chậm khi bạn có nhiều dữ liệu, vì chúng tạo ra các bảng tạm thời trong bộ nhớ, được đổi chỗ nếu bộ nhớ không đủ. –

Trả lời

14

Nó phải là đơn giản như:

CREATE VIEW YourViewName 
AS 
    WITH Tree (ID, [NAME], PARENT_ID, Depth, Sort) AS 
    (
     SELECT ID, [NAME], PARENT_ID, 0 AS Depth, CONVERT(varchar(255), [Name]) AS Sort   
     FROM Category 
     WHERE PARENT_ID = 0 
     UNION ALL 
     SELECT CT.ID, CT.[NAME], CT.PARENT_ID, Parent.Depth + 1 AS Depth, 
     CONVERT(varchar(255), Parent.Sort + ' | ' + CT.[NAME]) AS Sort 
     FROM Category CT 
     INNER JOIN Tree as Parent ON Parent.ID = CT.PARENT_ID 
    ) 

    -- HERE IS YOUR TREE, Depths gives you the level starting with 0 and Sort is the Name based path 
    SELECT ID, [NAME], PARENT_ID, Depth, Sort FROM Tree 
GO 
+0

Argh, dấu chấm phẩy, xin lỗi không thấy nó. PS: Không có nó đơn giản, chỉ gần như: Bạn cần phải loại bỏ thứ tự bằng cách hoặc thêm 100 phần trăm hàng đầu vào câu lệnh chọn ;-) –

+0

Bạn sẽ muốn xóa ORDER BY đó - Nó không thuộc về một khung nhìn, và SQL sẽ từ chối nó –

+0

@Quandary, @Damien: Cảm ơn bạn đã bắt được 'ORDER BY'. Một trong những mối nguy hiểm của mã hóa cắt-n-dán! :-) Tôi sẽ cập nhật một cách thích hợp. –

Các vấn đề liên quan