2016-08-09 14 views
1

Ich habe folgende Baumstruktur:SQL: Baumstrukturtabelle wählen

ROOT 
    -Invoices 
    -Documents 
     -Word 
     -Excel 

in folgenden Tabelle gespeichert:

LevelID; LevelParentID; level
1001; -1; ROOT
1002; 1001; Rechnungen
1003; 1001; Dokumente
1004; 1003; Wort
1005; 1003 ; Excel

'Rechnungen' und 'Dokumente' sind die wichtigsten Ebenen unter ROOT (1001) Ebene. Und die Unterebenen "Word" und "Excel" befinden sich unter der Ebene Dokumente (1003).

Ich möchte alle Zeilen unter einer bestimmten Ebene auswählen. Zum Beispiel, wie:

  1. ganzen Baum auswählen?
  2. Alle Ebenen unter 'Dokumente' auswählen?

Antwort

0
Declare @Table table (LevelID int,LevelParentID int,LevelName varchar(50)) 
Insert into @Table values 
(1001,-1,'ROOT'), 
(1002,1001,'Invoices'), 
(1003,1001,'Documents'), 
(1004,1003,'Word'), 
(1005,1003,'Excel') 


Declare @Top int = -1   -- 
Declare @Nest varchar(25) =' ' -- Optional: Added for readability 

;with cteHB (LevelID,LevelParentID,Lvl,LevelName) as (
    Select LevelID 
      ,LevelParentID 
      ,Lvl=1 
      ,LevelName 
     From @Table 
     Where @Top = case when @Top<0 then LevelParentID else LevelID end 
    Union All 
    Select cteCD.LevelID 
      ,cteCD.LevelParentID,cteHB.Lvl+1 
      ,cteCD.LevelName 
     From @Table cteCD 
     Join cteHB on cteCD.LevelParentID = cteHB.LevelID) 
Select LevelID 
     ,LevelParentID 
     ,Lvl 
     ,LevelName = Replicate(@Nest,Lvl) + LevelName 
From cteHB 

Returns, wenn @ Top = -1

LevelID LevelParentID Lvl LevelName 
1001 -1    1  ROOT 
1002 1001   2   Invoices 
1003 1001   2   Documents 
1004 1003   3   Word 
1005 1003   3   Excel 

Returns, wenn @ Top = 1003

LevelID LevelParentID Lvl LevelName 
1003 1001   1  Documents 
1004 1003   2   Word 
1005 1003   2   Excel 
+0

Muss die Tabelle Variable "@Table" erklären ... erklärt es Deklarieren @Table varchar (25) = 'Levels' aber immer noch da ... irgendwelche Hilfe? – ykhan

+0

@ykhan Ich bin mir nicht sicher, ob ich Ihren Kommentar verstehe. Die "@Tabelle" ist nur demonstrativ. Entfernen Sie die Definition der Tabellenvariablen und fügen Sie sie ein. Dann innerhalb der CTE, ersetzen (at) Tabelle mit YourTableName –

+0

Danke .. Es funktioniert :-) – ykhan