sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan opretter du forespørgsel fra overordnet underordnet hierarkitabel

Hvis du har et fast eller begrænset antal niveauer, behøver du muligvis ikke DYNAMISK SQL. "Parsing" stien kan opnås med lidt XML.

Overvej følgende:

Eksempel:

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

Returnering




  1. Dvalebrug af PostgreSQL-sekvens påvirker ikke sekvenstabellen

  2. Mere effektivt at have flere kolonner eller flere rækker?

  3. Omdøb en kolonne i mysql-tabel uden at skulle gentage dens typedefinition

  4. MySQL:Slet rækker, der indeholder en bestemt parameter og er ældre end en dag