sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man skapar en fråga från den överordnade underordnade hierarkitabellen

Om du har ett fast eller begränsat antal nivåer behöver du kanske inte DYNAMISK SQL. "Parsning" sökvägen kan åstadkommas med lite XML.

Tänk på följande:

Exempel:

Declare @YourTable Table ([Parent] varchar(50),[Child] varchar(50))
Insert Into @YourTable Values 
 (null ,'S-1')
,('S-1','S-11')
,('S-1','S-12')
,('S-1','S-13')
,('S-1','S-14')
,('S-1','S-15')
,('S-11','S-111')
,('S-11','S-112')

;with cteP as (
      Select Child
            ,Parent 
            ,PathID = cast(Child as varchar(500))
      From   @YourTable
      Where  Parent is Null
      Union  All
      Select Child  = r.Child
            ,Parent = r.Parent 
            ,PathID = cast(p.PathID+','+cast(r.Child as varchar(25)) as varchar(500))
      From   @YourTable r
      Join   cteP p on r.Parent  = p.Child)
Select [Group] = Child
      ,B.*
 From  cteP A
 Cross Apply (
                Select Level1 = xDim.value('/x[1]','varchar(max)')
                      ,Level2 = xDim.value('/x[2]','varchar(max)')
                      ,Level3 = xDim.value('/x[3]','varchar(max)')
                      ,Level4 = xDim.value('/x[4]','varchar(max)')
                      ,Level5 = xDim.value('/x[5]','varchar(max)')
                From  (Select Cast('<x>' + replace(PathID,',','</x><x>')+'</x>' as xml) as xDim) as X 
             ) B
  Order By PathID

Returer




  1. Flera kolumnvärden i en enda rad

  2. Avbrottstid för AWS RDS-instansuppgradering

  3. Slå samman flera rader till en med mer än ett radvärde i en kolumn

  4. oracle - samma fråga men annan plan i 11g och 12c