SQL 递归交叉层次结构

SQL recursive criss cross hierarchy

我有一个如下所示的数据集:

+---------+---------+---------+
| ColumnA | ColumnB | ColumnC |
+---------+---------+---------+
| 2964    | 12814   | 4       |
| 0001    | 0002    | 0       |
| 7745    | 2964    | 0       |
| 0003    | 0004    | 0       |
| 0002    | 0005    | 6       |
| 12986   | 7745    | 0       |
+---------+---------+---------+

基本上,我在我想要的输出中寻找的是:

+---------+---------+---------+
| ColumnA | ColumnB | ColumnC |
+---------+---------+---------+
| 12986   | 12814   | 4       |
+---------+---------+---------+

所以,本质上:

12986 在 7745 上加入,然后在 2964 上加入,得到 12814。其中 ColumnC 包含值 > 0。

我可以做到以上几点,但我的数据集可能达到数百万。所以这最终会导致太多的连接。我试过使用 HANA 的 hierarchy_descendants 函数。但我仍然没有得到想要的结果。我确实得到了级别,但我想要的是使用 ColumnA 中的 ID 来获取 ColumnB 中的相关 ID,其中 COLUMN

如有任何帮助,我们将不胜感激。

谢谢。

更新:

我知道我标记了 SQL ServerHana 但我认为如果两者都包括在内我可以获得更多解决方案。关于想要的结果,请看下面:

    +---------+---------+---------+
    | ColumnA | ColumnB | ColumnC |
    +---------+---------+---------+
    | 12986   | 12814   | 4       |
    | 0001    |  0005   | 6       |
    +---------+---------+---------+

所以我们必须双管齐下。

如果您使用 SQL 服务器作为 DBMS,那么您可以使用这样的递归 CTE( Common Table Expression )以带来所需的通过发生在 ColumnAColumnB 之间的分层步骤进行排序:

WITH t2(ColumnA, ColumnB, ColumnC, level) AS 
(
  SELECT t1.*, 1 
    FROM t1 where ColumnA = '12986'
   UNION ALL
  SELECT t2.ColumnA, t1.ColumnB, t1.ColumnC, t2.level + 1
    FROM t2
    JOIN t1 on t1.ColumnA = t2.ColumnB
)
SELECT ColumnA, ColumnB, ColumnC
  FROM t2
 WHERE level = (SELECT MAX(level) FROM t2);

Demo