【问题标题】:Getting depth-first traversal insted of breadth first in T-SQL在 T-SQL 中获取深度优先遍历的广度优先
【发布时间】:2014-04-28 08:49:24
【问题描述】:

我有以下 T-SQL 函数:https://gist.github.com/cwattengard/11365802

这会以广度优先遍历的方式返回数据。有没有一种简单的方法可以让这个函数在深度优先遍历中返回它的数据?我有一个可以满足此要求的树视图组件(旧系统)。

我已经有一个类似的存储过程,它以深度优先遍历的方式返回树,但它使用游标并且非常慢。 (6-7 秒,而此函数在相同数据上花费的时间不到一秒)。

【问题讨论】:

  • 也许你看起来像this

标签: tsql recursion common-table-expression


【解决方案1】:

我想我刚刚经历了一个灵光乍现的时刻。如果我添加 CTE 已经提供的 Path 变量,并按此排序,我会得到我想要的。 OrgID 是唯一的 ID。因此,按它排序将使其按用户的预期输出(按时间顺序)排序,并且对树视图来说是深度优先的。

【讨论】:

    【解决方案2】:
     http://sqlanywhere.blogspot.in/2012/10/example-recursive-union-tree-traversal.html
    

    这是一个显示树状结构表的主键的图表:

                               1
                               |
           ---------------------------------------
           2            93            4          5       
           |             |            |          |
    --------------  ------------  --------     ------  
    6  7  8  9  10  11 12 13  14  15 16 17     18  19
       |                   |             |      |
     -----               -----         -----  -----
     27 26               25 24         23 22  21 20
    

    以下是广度优先和深度优先查询应返回的内容:

    Breadth-First  Depth-First
    1              1
    2              2
    93             6
    4              7
    5              27
    6              26
    7              8
    8              9
    9              10
    10             93
    11             11
    12             12
    13             13
    14             25
    15             24
    16             14
    17             4
    18             15
    19             16
    27             17
    26             23
    25             22
    24             5
    23             18
    22             21
    21             20
    20             19
    

    【讨论】:

      【解决方案3】:

      如果您按tekst 订购输出,会这样做吗?

      首先在函数内部填充一个表变量@unsorted;然后最后返回Select * from @unsorted order by tekst

      【讨论】:

      • 不,Tekst 列是节点的名称(它是一个组织层次结构)。所以这只会给我一个字母排序。
      • 但在我看来,@returnTable.Tekst 最终包含了完整的路径。
      • 是的,确实如此。但是,路径永远不会从函数返回。它会正确排序但错误:P 但是我使用这个方法和一个零填充的 ID 来获得正确的排序。所以你的答案在精神上是正确的:)你可能会明白。
      【解决方案4】:

      我知道这对游戏来说已经很晚了,但似乎你可以使用 hierarchyid 来获得很好的深度优先搜索......

      op中引用的github文件好像不见了,但基本公式是

      1. 将 hierarchyid::GetRoot() 作为 Foo 放入 CTE 锚查询中
      2. 将强制转换 (cte.Foo.ToString() + cast(row_number() over(order by ) as varchar) + '/' as hierarchyid) 作为递归查询中的 Foo
      3. 调用 CTE 时按 Foo 排序

      结果是深度优先

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-10
        • 2010-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多