如何选择节点存储在单独表中的树

时间:2015-10-15 07:22:51

标签: mysql sql oracle algorithm recursion

假设我有这些表格:

A| k     B| k | a     C| k | a     D| k | c     E| k | d     ...
-----    ---------    ---------    ---------    ---------
 | 1      | 1 | 1      | 1 | 1      | 1 | 2      | 1 | 2
 | 2      | 2 | 1      | 2 | 1      | 2 | 2
 | 3      | 3 | 1      | 3 | 3
                       | 4 | 1

他们可以代表三种树结构:

    _____A1_______            A2            A3            ...
   /  /  |  |  \  \                         |
  B1 B2 B3  C1 C2 C4                        C3
              /  \
             D1   D2
                  |
                  E1

映射的规则是:

  • 一个表的行是另一个表的子项。即D中的所有行都是C中行的子节点(D.c映射到C.k)。
  • 部门没有限制
  • 每个节点的子节点数没有限制

目标是为每个叶节点选择一行。

行中的内容应与通过从根节点遍历树到叶节点所找到的内容相同。

这个例子可能是:

Ak | Bk | Ba | Ck | Ca | Dk | Dc | Ek | Ed
-------------------------------------------
 1 |  1 |  1 |    |    |    |    |    | 
 1 |  2 |  1 |    |    |    |    |    |  
 1 |  3 |  1 |    |    |    |    |    |  
 1 |    |    |  1 |  1 |    |    |    |  
 1 |    |    |  2 |  1 |  1 |  2 |    | 
 1 |    |    |  2 |  1 |  2 |  2 |  1 |  2
 1 |    |    |  4 |  1 |    |    |    |  
 2 |    |    |    |    |    |    |    |    
 3 |    |    |  3 |  3 |    |    |    | 

我已经制定了可行的解决方案/算法。通过递归生成选择,它将很容易扩展到更大的表和深度。但是,我不确定选择将如何在性能上进行扩展。此外,选择并不漂亮,人类不易阅读。

你会如何解决这个问题?

  • 解决方案必须或多或少地在主要数据库之间移植。

Use this gist to create the example tables

0 个答案:

没有答案