SQL 数据库查询结果按 ChildrenIDs 和 subChildrenIDs 分组

标签 sql sql-server database sql-server-2008

我在 SQL Server 2008 中有这个 [Folders] 表:

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] 列的子列。

例如,请注意 ID#12 (AV Finance 1) 是 ID#8 (Test Scripts) 的子文件夹,而 ID#8 (Test Scripts) 是 ID#2 (技术与开发).

我无法编写返回以下结果的查询

[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

有人可以帮我解决这个问题吗?

最佳答案

不清楚您是否正在跳过所需结果中的级别,但您似乎正在寻找递归 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

关于SQL 数据库查询结果按 ChildrenIDs 和 subChildrenIDs 分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58019056/

相关文章:

.net - 为什么我的数据表单元格返回空值?

php - 如何在迭代 DatePeriod 时包括今天?

arrays - 使用数组比较和共享多个工作簿和工作表之间的数据

Mysql用户创建脚本

mysql - 为什么索引列在查询 `IS NULL` 时返回结果会很慢?

sql - sqlite中的复合主键

php - PHP 可以与 MS SQL 数据库一起使用吗

sql-server - TClientDataSet 和大插入

sql - 在 R 脚本中使用 R 变量的 where 子句以在 SQL 语句中使用它

php - 如何使用 PHP 将一组特定的用户数据从一个 MySQL 数据库移动到另一个数据库?