[英]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 FOOWith 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.