我有桌子,我想要3棵lvl树。 实施例
Node
Id ParentId Name
1 -1 Test 1
2 -1 Test 2
3 1 Test 1.1
4 1 Test 1.2
5 3 Test 1.1.1
6 3 Test 1.1.2
7 5 Test 1.1.1.1
如果我过滤了ParentId = -1
,我想要获取行ParentId = -1
和children's +2
拉特。
如果我filtered Id = 2
我想要获得行Id = 2
和children's +2
LVL。
更新
我使用MS SQL Server 2008,Entity Framework 6.1.3。 我明白了,我可以使用3个选择。但我看起来有效的方法
答案 0 :(得分:1)
您可以使用递归SQL在SQL Server中执行此操作。
WITH recCTE (childID, parentID, Name, Depth) Assuming
(
Select
yourTable.id as childid,
yourTable.parentID,
CAST('Test ' + yourTable.id as varchar(20)) as Name
0 as Depth
FROM
yourTable
WHERE
parentID = -1
UNION ALL
Select
yourTable.id as childID,
yourTable.ParentID as ParentID,
recCTE.path + '.' + yourTable.id AS Name
recCTE.depth + 1 as Depth
FROM
recCTE
INNER JOIN yourTable on
recCTE.childID = yourTable.parentID
Where
recCTE.Depth + 1 <= 2
)
SELECT * FROM recCTE;
UNION
顶部CTE内的位是递归sql的种子查询。这是递归查找开始的地方。您想从parentID = -1
开始,因此它位于WHERE
声明中。
UNION
以下CTE内的位是递归项。这会将递归CTE连接回自身并从表中引入更多数据。将表中的id与递归结果集中的childID连接起来。
递归术语是我们测试的地方,看看我们有多深。如果CTE + 1的深度小于或等于2,那么我们停止向循环中添加子项,结束层次结构中该特定段的循环。
CTE下方的最后一点只是运行CTE的部分,因此您可以获得结果。
这些递归查询起初很混乱,但是花一些时间与它们相比,你会发现它们有很多用处。你也会发现,一旦你把所有部件都拿出去,它们就不会太难写了。