繁体   English   中英

SQL查询从表中提取嵌套

[英]SQL Query to extract nesting from a table

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

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,但我似乎无法弄清楚。 感谢您的帮助!

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

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

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

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

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

SQL小提琴: hierarchyid示例小提琴

我决定采用一种稍微不同的方法来回答这个问题,使用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中是很差的。 我以某种方式重写并介绍了它,使我发现将头缠绕起来要容易得多。

所有建议的解决方案都可以很好地解决发布的问题。 在我的“实际”情况下,该表要复杂得多,并且已经有许多APPLY语句(我想是特定的SQL Server),所以我最终使用了发布的Join语句的“外部应用”变体: With a AS ( SELECT id, name from Nesting )
SELECT id, name, ParentName from a OUTER APPLY ( SELECT name as ParentName from Nesting n where n.parentid = a.id
) AS FOO
With a AS ( SELECT id, name from Nesting )
SELECT id, name, ParentName from a OUTER APPLY ( SELECT name as ParentName from Nesting n where n.parentid = a.id
) AS FOO

非常感谢大家!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM