Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да създадете заявка от йерархична таблица родител дъщерна

Ако имате фиксиран или ограничен брой нива, може да не се нуждаете от DYNAMIC SQL. „Синтактичен анализ“ пътят може да бъде осъществен с малко XML.

Имайте предвид следното:

Пример:

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

Връщане




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Заменете дублиращите се интервали с едно пространство в T-SQL

  2. Как да активирате улавянето на промяна на данни (CDC) в база данни в SQL Server - урок за SQL Server

  3. SQL Server 2016

  4. Не може да се предаде COM обект от тип „System.__ComObject“ към тип интерфейс „Microsoft.VisualStudio.OLE.Interop.IServiceProvider“

  5. Създайте вложени JSON масиви, като използвате FOR JSON PATH