为了账号安全,请及时绑定邮箱和手机立即绑定

将平台解析成树的最有效/优雅的方法是什么?

将平台解析成树的最有效/优雅的方法是什么?

慕森王 2019-05-27 11:05:02
将平台解析成树的最有效/优雅的方法是什么?假设您有一个存储有序树层次结构的平面表:Id   Name         ParentId   Order 1   'Node 1'            0      10 2   'Node 1.1'          1      10 3   'Node 2'            0      20 4   'Node 1.1.1'        2      10 5   'Node 2.1'          3      10 6   'Node 1.2'          1      20这是我们所拥有的图表[id] Name。根节点0是虚构的。                       [0] ROOT                          / \               [1]节点1 [3]节点2              / \ \    [2]节点1.1 [6]节点1.2 [5]节点2.1          /           [4]节点1.1.1您将使用什么简约方法将其输出为HTML(或文本,就此而言)作为正确排序,正确缩进的树?进一步假设你只有基本的数据结构(数组和散列图),没有带有父/子引用的花哨对象,没有ORM,没有框架,只有你的双手。该表表示为结果集,可以随机访问。伪代码或普通英语是可以的,这纯粹是一个概念性的问题。额外问题:在RDBMS中存储这样的树结构是否有根本更好的方法?
查看完整描述

3 回答

?
元芳怎么了

TA贡献1798条经验 获得超7个赞

从Oracle 9i开始,您可以使用CONNECT BY。


SELECT LPAD(' ', (LEVEL - 1) * 4) || "Name" AS "Name"

FROM (SELECT * FROM TMP_NODE ORDER BY "Order")

CONNECT BY PRIOR "Id" = "ParentId"

START WITH "Id" IN (SELECT "Id" FROM TMP_NODE WHERE "ParentId" = 0)

从SQL Server 2005开始,您可以使用递归公用表表达式(CTE)。


WITH [NodeList] (

  [Id]

  , [ParentId]

  , [Level]

  , [Order]

) AS (

  SELECT [Node].[Id]

    , [Node].[ParentId]

    , 0 AS [Level]

    , CONVERT([varchar](MAX), [Node].[Order]) AS [Order]

  FROM [Node]

  WHERE [Node].[ParentId] = 0

  UNION ALL

  SELECT [Node].[Id]

    , [Node].[ParentId]

    , [NodeList].[Level] + 1 AS [Level]

    , [NodeList].[Order] + '|'

      + CONVERT([varchar](MAX), [Node].[Order]) AS [Order]

  FROM [Node]

    INNER JOIN [NodeList] ON [NodeList].[Id] = [Node].[ParentId]

) SELECT REPLICATE(' ', [NodeList].[Level] * 4) + [Node].[Name] AS [Name]

FROM [Node]

  INNER JOIN [NodeList] ON [NodeList].[Id] = [Node].[Id]

ORDER BY [NodeList].[Order]

两者都将输出以下结果。


名称

'节点1'

'节点1.1'

'节点1.1.1'

'节点1.2'

'节点2'

'节点2.1'


查看完整回答
反对 回复 2019-05-27
  • 3 回答
  • 0 关注
  • 516 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信