Sql查询3级树?

时间:2015-04-22 15:48:22

标签: sql sql-server tree

我有桌子,我想要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 = -1children's +2 拉特。

如果我filtered Id = 2我想要获得行Id = 2children's +2 LVL。

更新

我使用MS SQL Server 2008,Entity Framework 6.1.3。 我明白了,我可以使用3个选择。但我看起来有效的方法

1 个答案:

答案 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的部分,因此您可以获得结果。

这些递归查询起初很混乱,但是花一些时间与它们相比,你会发现它们有很多用处。你也会发现,一旦你把所有部件都拿出去,它们就不会太难写了。