Результаты группировки запросов к базе данных SQL по дочерним и дочерним идентификаторам - PullRequest
1 голос
/ 20 сентября 2019

У меня есть эта таблица [Folders] в SQL Server 2008:

TABLE [dbo].[Folders]
(
    [FolderID] [NUMERIC](18, 0) IDENTITY(1,1) NOT NULL,
    [SubFolderOf] [NUMERIC](18, 0) NOT NULL,
    [FolderName] [VARCHAR](128) NOT NULL
)

Вот данные в этой таблице

[ID]  [SubFolderOf] [FolderName]
------------------------------------------------
1      0             Main [ROOT]
2      1             Technical And Development
3      1             Sales and Marketing
4      1             Legal
5      1             Finance
6      1             Departments
7      1             Compliance
8      2             Test Scripts
9      2             Documentation
10     2             Files
11     8             AV Training
12     8             AV Finance 1

Столбец [SubFolderOf] является дочерним по отношению к[ID] column.

Например, обратите внимание, что ID # 12 (AV Finance 1) - это подпапка ID # 8 (Test Scripts), которая является подпапкой ID # 2 (Technical and Development).

Мне не удалось написать запрос, который бы дал следующие результаты

[ID]  [Field Name]
----------------------------------------------------------
1     Main
2     Main >> Technical and Development
11    Main >> Technical and Development >> AV Training
12    Main >> Technical and Development >> AV Finance 1
3     Main >> Sales and Marketing
4     Main >> Legal

Может кто-нибудь помочь мне с этим?

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

Не ясно, пропускаете ли вы уровни в желаемых результатах, но похоже, что вы ищете рекурсивный CTE.Я уверен, что это совместимо с 2008 годом.

Пример

Declare @YourTable Table ([ID] int,[SubFolderOf] int,[FolderName] varchar(50))
Insert Into @YourTable Values 
 (1,0,'Main [ROOT]')
,(2,1,'Technical And Development')
,(3,1,'Sales and Marketing')
,(4,1,'Legal')
,(5,1,'Finance')
,(6,1,'Departments')
,(7,1,'Compliance')
,(8,2,'Test Scripts')
,(9,2,'Documentation')
,(10,2,'Files')
,(11,8,'AV Training')
,(12,8,'AV Finance 1')

Declare @Nest   varchar(25) = '|-----'  --<<  Optional: Added for readability

;with cteP as (
      Select Seq  = cast(10000+Row_Number() over (Order by ID) as varchar(500))
            ,ID
            ,SubFolderOf 
            ,Lvl=1
            ,FolderName 
            ,Path = cast(FolderName as varchar(500))
      From   @YourTable 
      Where  [SubFolderOf]=0
      Union  All
      Select Seq  = cast(concat(p.Seq,'.',10000+Row_Number() over (Order by r.ID)) as varchar(500))
            ,r.ID
            ,r.SubFolderOf 
            ,p.Lvl+1
            ,r.FolderName 
            ,cast(p.path + ' >> '+r.FolderName as varchar(500))
      From   @YourTable r
      Join   cteP p on r.SubFolderOf  = p.ID)
Select A.ID
      ,A.SubFolderOf 
      ,A.Lvl
      ,FolderName = Replicate(@Nest,A.Lvl-1) + A.FolderName
      ,Path
 From cteP A
 Order By Seq

Возвращает

enter image description here

0 голосов
/ 20 сентября 2019

У вас есть пара вариантов, вы можете либо самостоятельно присоединиться к таблице пару раз (левое соединение), либо использовать «повторяющиеся cte», которые являются распространенным выражением таблицы.Я считаю, что с самостоятельным объединением легче работать.Вам нужно определить, сколько раз или уровней вы можете максимально использовать, например, 3 уровня глубиной, 5 или 10.

Примерно так:

select F.FolderId, concat(isnull(F3.FolderName, “”), “>>”, isnull(F2.FolderName, “”), “>>”, F.FolderName) as [Field name] from Folders as F
left join Folders as F2 on F2.FolderId = F.SubFolderOf
left join Folders as F3 on F3.FolderId = F2.SubFolderOf

Вы можете исключить лишние «>>”Например, используя выражение case или подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...