2010-03-02 25 views
5

Với truy vấn đệ quy sau:Recursive Query - Chỉ chọn nút nơi các nút lá đại diện cho dữ liệu hoạt động

WITH DepartmentHierarchy (DepartmentID, Name, IsInactive, IsSpecial, ParentId, HierarchyLevel) AS 
(
    -- Base case 
    SELECT 
     DepartmentId, 
     Name, 
     IsInactive, 
     IsSpecial, 
     ParentId, 
     1 as HierarchyLevel 
    FROM StoreDepartment 
    WHERE ParentId IS NULL 

    UNION ALL 

    -- Recursive step 
    SELECT 
     d.DepartmentId, 
     d.Name, 
     d.IsInactive, 
     d.IsSpecial, 
     d.ParentId, 
     dh.HierarchyLevel + 1 AS HierarchyLevel 
    FROM StoreDepartment d 
     INNER JOIN DepartmentHierarchy dh ON 
     d.ParentId = dh.DepartmentId 
) SELECT * FROM DepartmentHierarchy 

tôi có thể chọn dữ liệu mà trông như thế này:

DepartmentId, Name, IsInactive, IsSpecial, ParentId, HeirarchyLevel 
1, Store, 0, 0, NULL, 1 
2, Main Department 1, 0, 1, 2 
3, Main Department 2, 0, 1, 2 
4, Sub For Main 1, 0, 2, 3 

Ngoài ra, giả sử một bảng tồn tại với DepartmentId và ItemId (ví dụ: DepartmentItemRelationship). Các nút lá từ hệ thống heirarchy bộ phận được ghép nối với các mục ở đây.

Tôi muốn truy vấn đệ quy của mình chỉ trả về các nút (ở mọi cấp độ) có ít nhất một nút lá bên dưới chúng với một kết quả phù hợp trong bảng quan hệ bộ phận/mục. Các nút này có thể là 6 hoặc 7 cấp độ xuống, vì vậy tôi không chắc chắn cách tôi sẽ sửa đổi truy vấn của mình để chắc chắn bao gồm những điều đó.

Cảm ơn, Kyle

+0

Kyle, nếu bạn có nút lá đáp ứng yêu cầu ở cấp 6, bạn có muốn hiển thị 5 phòng ban phía trên nút đó không? –

Trả lời

3

Bạn có thể tạo một cột con đường mà theo dõi những hệ thống phân cấp. Sau đó, bạn chỉ có thể thêm các nút con có khớp trong bảng DepartmentItemRelationship. Và cuối cùng chỉ nhận được các nút ít nhất có một đứa trẻ.

Hãy thử một cái gì đó như thế này:

WITH DepartmentHierarchy (DepartmentID, Name, IsInactive, IsSpecial, ParentId, HierarchyLevel) AS 
(
    -- Base case 
    SELECT 
     '/'+cast(DepartmentId as varchar(max)) as [path] 
     DepartmentId, 
     Name, 
     IsInactive, 
     IsSpecial, 
     ParentId, 
     1 as HierarchyLevel 
    FROM StoreDepartment 
    WHERE ParentId IS NULL 

    UNION ALL 

    -- Recursive step 
    SELECT 
     dh.[path] +'/'+ cast(d.DepartmentId as varchar(max)) as [path] 
     d.DepartmentId, 
     d.Name, 
     d.IsInactive, 
     d.IsSpecial, 
     d.ParentId, 
     dh.HierarchyLevel + 1 AS HierarchyLevel 
    FROM StoreDepartment d 
     INNER JOIN DepartmentHierarchy dh ON 
     d.ParentId = dh.DepartmentId 
    where exists (select top 1 1 
        from DepartmentItemRelationship di 
        where di.DepartmentId = d.DepartmentId) 
) 
SELECT * 
FROM DepartmentHierarchy dh 
where exists (select top 1 1 
       from DepartmentHierarchy 
       where charindex('/'+dh.DepartmentID+'/',[path]) > 0) 
+0

Điều này hoạt động rực rỡ. Chỉ cần có con đường đi ngang qua cây sẽ giúp tôi giải quyết những hồ sơ tôi cần phải quay trở lại. (lưu ý: tôi đã xóa mệnh đề 'TOP' vì nó không được phép trong truy vấn đệ quy). –

1

Nếu tôi hiểu bạn một cách chính xác, bạn muốn tất cả các nút được chính xác một mức độ trên mức lá?

Bạn thực sự không cần truy vấn đệ quy cho việc này. Tất cả những gì bạn phải tìm đầu tiên là các nút lá, sau đó chọn tất cả các bậc cha mẹ.

WITH LeafNodeParents AS 
(
    SELECT DISTINCT ParentId 
    FROM StoreDepartment 
    WHERE DepartmentId NOT IN 
    (
     SELECT DISTINCT ParentId FROM StoreDepartment 
    ) 
) 
SELECT d.DepartmentId, d.Name, d.IsInactive, d.IsSpecial, d.ParentId 
FROM LeafNodeParents p 
INNER JOIN StoreDepartment d 
    ON d.DepartmentId = p.ParentId 

Điều duy nhất điều này sẽ không cho bạn biết là cấp độ. Tôi không chắc bạn cần đến mức độ nào. Nếu bạn không, điều này sẽ thực hiện tốt hơn so với phiên bản đệ quy; nếu bạn làm như vậy, có vẻ như truy vấn của Jose là OK cho điều đó (đánh giá nhanh).

+0

Cảm ơn bạn đã đề xuất, tôi đã chấp nhận câu trả lời khác vì nó cho phép tôi lấy dữ liệu từ tất cả các nút. Tôi vẫn đánh giá cao (và upvoted) câu trả lời của bạn. –

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