当id和parent id在同一个表中时,我可以选择父级的完整层次结构吗?

时间:2010-12-08 21:28:04

标签: sql linq-to-sql hierarchical-data

我有一个表,其中包含Id和parentId的列。 ParentId包含表中另一行的Id。如果ParentId为null,则它是层次结构的顶部。

我有一行的Id,我想在层次结构中选择它上面的所有行。我可以一次性选择吗?

所以在这个例子中:

Id | parentId |其他栏目
 1 |空
 2 | 1
 3 | 2

如果我有id = 3我想选择行1,2,3。

我可以在linq中使用sql吗?

3 个答案:

答案 0 :(得分:2)

您可以使用recursive CTE在单个选择中执行此操作,但是LINQ to SQL不支持此操作,因此您必须使用查询创建存储过程并将其从LINQ调用到SQL。

答案 1 :(得分:1)

查看 this example ,使用递归CTE。

答案 2 :(得分:1)

不知道LINQ,但正如其他回答者所写,许多关系数据库支持公用表表达式(CTE) - 但不是全部(Oracle会想到)。如果支持,CTE是检索“祖先”的好方法。

注意到,还有一些其他方法需要考虑特别是桥接表或嵌套集。 See my question for some explanation of these options以及表示分层数据的其他方式。简而言之,最有可能使用CTE从触发器更新的桥接表很容易为您提供所有祖先或后代 - 只是没有接近。嵌套集模型将为您提供此信息,以及相对于更昂贵的插入和更新的代价。