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 Server 和 Hana 但我认为如果两者都包括在内我可以获得更多解决方案。关于想要的结果,请看下面:
+---------+---------+---------+
| ColumnA | ColumnB | ColumnC |
+---------+---------+---------+
| 12986 | 12814 | 4 |
| 0001 | 0005 | 6 |
+---------+---------+---------+
所以我们必须双管齐下。
如果您使用 SQL 服务器作为 DBMS,那么您可以使用这样的递归 CTE( Common Table Expression )以带来所需的通过发生在 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);
我有一个如下所示的数据集:
+---------+---------+---------+
| 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 Server 和 Hana 但我认为如果两者都包括在内我可以获得更多解决方案。关于想要的结果,请看下面:
+---------+---------+---------+
| ColumnA | ColumnB | ColumnC |
+---------+---------+---------+
| 12986 | 12814 | 4 |
| 0001 | 0005 | 6 |
+---------+---------+---------+
所以我们必须双管齐下。
如果您使用 SQL 服务器作为 DBMS,那么您可以使用这样的递归 CTE( Common Table Expression )以带来所需的通过发生在 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);