SQL递归交叉层次结构

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

+---------+---------+---------+
| 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 Server 作为 DBMS,那么您可以使用这样的递归 CTE(公用表表达式),以便通过发生在ColumnA之间的分层步骤来获得所需的行ColumnB

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章