【问题标题】:Sql query for 3 level tree?3 级树的 Sql 查询?
【发布时间】:2015-04-23 01:33:40
【问题描述】:

我有桌子,我想要 3 级树。 示例

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 lvl.

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

更新

我使用 MS SQL Server 2008,实体框架 6.1.3。 我明白了,我可以使用 3 个选择。但我寻找有效的方法

【问题讨论】:

标签: sql sql-server tree


【解决方案1】:

您可以在 SQL Server 中使用递归 SQL 来执行此操作。

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 的部分,因此您可以返回结果。

这些递归查询一开始会让人迷惑不解,但花一些时间了解它们,您会发现它们很有用处。一旦你把所有的部分都搞清楚了,你还会发现它们并不太难写。

【讨论】:

  • 你运行了吗?您提供的脚本中有很多拼写错误(缺少逗号、错误名称等)。
  • @oleksii。不,我没有。我假设 op 可以弄清楚在哪里放置逗号并拼写它们的字段名称。如果您想改进它,您可以单击编辑按钮并修复您看到的错误。
猜你喜欢
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
相关资源
最近更新 更多