【发布时间】:2023-03-21 23:25:02
【问题描述】:
各位程序员朋友您好!
我有这个包含类别和子类别的表(实际上我没有,但让我们坚持一个经典示例):
Id ParentId Name
1 NULL A
2 1 B
3 2 C
4 3 D
5 NULL B
6 5 D
有没有办法让我通过查询表的完整路径来获得类别“D”(id 4)? (见下面的伪代码)
SELECT * FROM Categories WHERE FullPath = "A/B/C/D"
// Result:
Id ParentId Name
4 3 D
我知道可以使用左连接来获取完整路径,但是如何编写查询以通过提供路径来获取叶节点?
编辑(解决方案):
帮助 van 和 Eric 的帮助,这就是我所做的:
with p as
(
select
c.*,
cast(c.Name as varchar(1024)) as NamePath
from
Categories c
where
ParentCategoryId is null
union all
select
c.*,
cast(p.NamePath + '/' + c.Name as varchar(1024)) as NamePath
from
Categories c
inner join p on
c.ParentCategoryId = p.CategoryId
)
select Id, Name
from p
where NamePath = 'A/B/C/D'
谢谢大家,你们的回答都非常有帮助!我希望我能够将它们都标记为解决方案。
这一次我会选择积分最少的(即van)。
【问题讨论】:
-
你想要这个做什么? SQL Server 2008 允许您使用
hierarchyid数据类型完全按照您的意愿行事,但是对于 -
我在寻找一个通用的 SQL 实现。但是该应用程序将构建在 SQL Server 2k8 之上,并且将使用 LINQ2SQL 或 EF 获取数据。所以我不认为 hierarchyid 数据类型是一个选项,对吧?
标签: sql mysql sql-server linq-to-sql