我有一个表,其中从一行到另一行进行引用。所以基本上是这样的:
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,但我似乎无法弄明白。 谢谢你的帮助!
答案 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
非常感谢你们!