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

Sql 当id和父id在同一个表中时,我可以选择父的完整层次结构吗?,sql,linq-to-sql,hierarchical-data,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 to sql中执行吗?您可以使用一次选择来执行,但是linq to sql不支持这一点,因此您必须使用查询创建一个存储过程,并将其从li

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

我有一行的Id,我想在层次结构中选择它上面的所有行。我可以在一次选择中完成此操作吗

所以在这个例子中:

Id | parentId |其他列
1 |空
2|1
3 | 2

如果id=3,我想选择第1、2、3行


我可以在linq to sql中执行吗?

您可以使用一次选择来执行,但是linq to sql不支持这一点,因此您必须使用查询创建一个存储过程,并将其从linq调用为sql。

看看,使用递归CTE。

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

注意到,还有一些其他方法需要考虑,特别是桥接表或嵌套集合。以及表示分层数据的其他方式。简单地说,最有可能使用CTE从触发器更新的桥接表将很容易地为您提供所有祖先或后代,只是距离不远。嵌套集模型将向您提供这些信息,以及这些信息的接近程度,但代价是插入和更新的成本相对较高