Sql 如何在单独的列中显示位置结构

Sql 如何在单独的列中显示位置结构,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,我有以下位置表 ID Name ParentID ----------------------- 1 TopLevel NULL 2 Region 1 1 3 Fleet 1 2 4 Fleet 2 2 我最近刚刚完成了一个递归CTE的编写,以层次方法显示此结构: TopLevel -Region 1 --Fleet 1 --Fleet 2 我现在需要编写一个查询以列层次结构格式返回此结构: Level1 Level2 Level

我有以下
位置

ID  Name       ParentID
-----------------------
1   TopLevel   NULL
2   Region 1   1
3   Fleet 1    2
4   Fleet 2    2
我最近刚刚完成了一个递归CTE的编写,以层次方法显示此结构:

TopLevel
-Region 1
--Fleet 1
--Fleet 2
我现在需要编写一个查询以列层次结构格式返回此结构:

Level1     Level2   Level3  Level4  Level5  Level6
Top Level
Top Level  Region 1 Fleet 1
Top Level  REgion 1 Fleet 2

一个位置可以达到的最大深度是9。我将如何做到这一点?我试图使用递归CTE并在此基础上进行构建,但我认为这行不通。还有其他想法吗?

这里有一种实现输出的方法,使用递归CTE硬编码来填充多达9层的层次结构(您需要根据实际对象名称更改表/列引用,并且可能需要增加
varchar(50)
如果
名称
列的实际类型比该列宽):

样本输出:

| ID | LEVEL |   LEVEL1 |   LEVEL2 |  LEVEL3 | LEVEL4 | LEVEL5 | LEVEL6 | LEVEL7 | LEVEL8 | LEVEL9 |
----------------------------------------------------------------------------------------------------
|  1 |     1 | TopLevel |   (null) |  (null) | (null) | (null) | (null) | (null) | (null) | (null) |
|  2 |     2 | TopLevel | Region 1 |  (null) | (null) | (null) | (null) | (null) | (null) | (null) |
|  3 |     3 | TopLevel | Region 1 | Fleet 1 | (null) | (null) | (null) | (null) | (null) | (null) |
|  4 |     3 | TopLevel | Region 1 | Fleet 2 | (null) | (null) | (null) | (null) | (null) | (null) |

演示:

这里有一种方法可以完成输出,使用递归CTE硬编码来填充多达9层的层次结构(您需要根据需要将表/列引用更改为真实对象名,并且可能需要增加
varchar(50)
如果
名称
列的实际类型比该列宽):

样本输出:

| ID | LEVEL |   LEVEL1 |   LEVEL2 |  LEVEL3 | LEVEL4 | LEVEL5 | LEVEL6 | LEVEL7 | LEVEL8 | LEVEL9 |
----------------------------------------------------------------------------------------------------
|  1 |     1 | TopLevel |   (null) |  (null) | (null) | (null) | (null) | (null) | (null) | (null) |
|  2 |     2 | TopLevel | Region 1 |  (null) | (null) | (null) | (null) | (null) | (null) | (null) |
|  3 |     3 | TopLevel | Region 1 | Fleet 1 | (null) | (null) | (null) | (null) | (null) | (null) |
|  4 |     3 | TopLevel | Region 1 | Fleet 2 | (null) | (null) | (null) | (null) | (null) | (null) |

演示:

我可以看到使用了9条UNION语句,因此您可能会得到所需的输出,但这并不漂亮

这里有3个级别(您应该能够相应地添加):

以此类推,为每个后续级别的联接添加更多的表。似乎有更好/更简单的方法,这是我脑海中唯一能想到的方法


以下是。

我可以看到使用9个UNION语句,这样您可能会得到所需的输出,但这并不漂亮

这里有3个级别(您应该能够相应地添加):

以此类推,为每个后续级别的联接添加更多的表。似乎有更好/更简单的方法,这是我脑海中唯一能想到的方法


以下是。

您应该在应用程序端执行此操作。此操作没有前端,全部在数据库中。如何“全部在数据库中”?所有关心行与列的最终用户都在Management Studio中查看结果?这些级别用于另一个usp执行工作的过程,然后将其推送到报告中。我认为报告应该是前端,但如果可能的话,需要在数据库中处理级别。您应该在应用程序端执行此操作。此操作没有前端,全部在数据库中。如何“全部在数据库中”?所有关心行与列的最终用户都在Management Studio中查看结果?这些级别用于另一个usp执行工作的过程,然后将其推送到报告中。我想报告应该是前端,但是如果可能的话,需要在DB中处理级别。这正是我想要的。我做的每件事都是一样的,但案例陈述中的其他内容是我遗漏的,谢谢!这正是我想要的。我做的每件事都是一样的,但案例陈述中的其他内容是我遗漏的,谢谢!
SELECT Name as Level1, '' as Level2, '' as Level3
FROM Location
WHERE ParentId IS NULL
UNION
SELECT L1.Name as Level1, L2.Name as Level2, '' as Level3
FROM Location L1
JOIN Location L2 
    ON L1.Id = L2.ParentId 
    AND L1.ParentId IS NULL
UNION
SELECT L1.Name as Level1, L2.Name as Level2, L3.Name as Level3
FROM Location L1
JOIN Location L2 
    ON L1.Id = L2.ParentId 
    AND L1.ParentId IS NULL
JOIN Location L3 
    ON L2.Id = L3.ParentId 
    AND L1.ParentId IS NULL