SQL Query从表中提取嵌套

时间:2018-04-14 18:30:59

标签: sql sql-server

我有一个表,其中从一行到另一行进行引用。所以基本上是这样的:

ID | Name | ParentId
1  | Root | 
2  | Top  |  
3  | Sub1 | 1
4  | Sub2 | 2

第三列[ParentId]表示当前行的父级。 我的问题是如何使用SQL查询从表中获取此嵌套。 我希望从查询中看到的结果是

ID | Name | ParentName
1  | Root | NULL
2  | Top  | NULL
3  | Sub1 | Root
4  | Sub2 | Top

它可能看起来微不足道,因为它只是用项目的名称替换第三列的id,但我似乎无法弄明白。 谢谢你的帮助!

5 个答案:

答案 0 :(得分:3)

对于单个级别,您可以在同一个表上使用左连接

select a.id, a.name, b.name 
from my_table a  
left join my_table b on b.parentId = a.id 

答案 1 :(得分:0)

select t1.id, t1.name, t2.name as parentName
from  table t1
left join  table t2
on t2.id = t1.parentId

答案 2 :(得分:0)

以下查询将帮助您实现目标:

SELECT
    t1.Id,
    t1.Name,
    (SELECT t2.Name FROM MyTable t2 WHERE t2.Id = t1.ParentId) ParentName 
FROM
    MyTable t1

如果表格中有很多记录,通过在ParentId列上创建索引,您可以比JOIN更快地运行上述查询。

答案 3 :(得分:0)

SQL小提琴: hierarchyid example fiddles

我决定采用稍微不同的方法来回答这个问题,使用SQL Server内部支持的hierarchyid数据类型。 创建hierarchyid是为了专门处理嵌套关系的记录选择/查询功能,并且一旦习惯了数据类型带来的一些小烦恼(例如通常需要的内联查询/子查询才能到达记录的实际id值),它实际上很漂亮。

我创建了一个SQL小提琴,逐步显示如何使用数据类型作为示例嵌套关系:

/Category One
    /Subcategory 1
        /Subcategory 1.1
        /Subcategory 1.2
        /Subcategory 1.3
    /Subcategory 2
    /Subcategory 3
        /Subcategory 3.1
            /Subcategory 3.1.1
    /Subcategory 4
/Category Two
    /Subcategory 1

注意:tsql被重写并注释了MSDN示例代码,这实际上是非常糟糕的imo。我已经改写并以这样的方式呈现它,以至于我发现它更容易缠绕。

答案 4 :(得分:0)

所有提议的解决方案都适用于发布的问题。在我的“真实”情况下,表格要复杂得多,并且已经有很多APPLY语句(特定的SQL Server,我猜)所以我最终使用了已发布的Join语句的“Outer Apply”变体: Column

非常感谢你们!