2010-03-02 21 views
5

temsil Yalnızca seçilen düğümleri:Yinelemeli Sorgu - yaprak düğümleri aktif verileri aşağıdaki özyinelemeli sorgu Verilen

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 

Şöyle verileri seçmek mümkün duyuyorum: Ayrıca

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 

, bir farz tablosu, DepartmentId ve ItemId (ex: DepartmentItemRelationship) ile var. Bölüm heirarşisinden gelen yaprak düğümleri buradaki öğelerle eşleştirilir.

Yinelemeli sorgum, yalnızca bölüm/öğe ilişkisi tablosundaki bir eşleşme ile en az bir yaprak düğümü içeren düğümleri (herhangi bir düzeyde) döndürmesini istiyorum. Bu düğümler 6 veya 7 seviye aşağı olabilir. Bu nedenle, bu soruyu içerdiğinden emin olmak için sorgumu nasıl değiştireceğimi bilmiyorum.

sayesinde Kyle

+0

Kyle, 6. düzeydeki gereksinimi karşılayan bir yaprak düğümünüz varsa, o düğümün üstündeki 5 bölümü göstermek ister misiniz? –

cevap

3

hiyerarşinin izler bir yol sütun oluşturabilirsiniz. Daha sonra, yalnızca DepartmentItemRelationship tablosunda bir eşleşme olan çocuk düğümlerini ekleyebilirsiniz. Ve sonunda en azından bir çocuğu olan sadece düğümleri al. Böyle

deneyin şey:

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

Bu, harika çalışıyor. Sadece ağacın içinden geçme yoluna sahip olmak, geri dönmem gereken kayıtları çözmeme yardımcı olacaktır. (Not: Yinelemeli bir sorguda izin verilmediğinden 'TOP' yan tümcesini kaldırdım). –

1

seni doğru anladıysam varsa, yaprak seviyesinden tam olarak bir seviye olan tüm düğümleri istiyorum?

Bunun için yinelemeli bir sorguya ihtiyacınız yok. Tek yapmanız gereken önce yaprak düğümlerini bulmak, ardından tüm ebeveynleri seçmek.

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 

Bu size söyleyemeyeceği tek şey düzeydir. Buna ne kadar ihtiyacın olduğuna emin değilim. Eğer yapmazsanız, bu yinelemeli sürümden daha iyi bir şekilde yapılmalıdır; Eğer yaparsanız, Jose'nin sorgusu bunun için iyi gibi görünüyor (hızlı bir bakışta karar vererek).

+0

Öneri için teşekkürler, diğer cevabı kabul ettim çünkü tüm düğümlerden veri almamı sağladı. Cevabınızı hala takdir ediyorum (ve destekledim). –