1

我有一个像下面这样的场景。

在表 A 中,记录如下。

col1   col2
----   ----
P1     P2                                  
P2     P3                        
P3     P4

现在我想要一个查询来获得如下输出。

col1   col2
----   ----
P1     P4

这意味着 P1 链接到 P2,然后 P2 链接到 P3,然后 P3 链接到 P4。所以我们需要得到P1到P4。任何人都可以建议如何在 DB2 中执行此操作吗?

4

1 回答 1

2

您可以使用递归 CTE。

WITH cte (level, col1, col2) AS (
 SELECT 1, col1, col2
 FROM table_a
 WHERE col1='P1'
 UNION ALL
 SELECT cte.level+1, cte.col1, a.col2
 FROM table_a a
 INNER JOIN cte ON cte.col2=a.col1
)
SELECT 
 col1, MAX(col2) as col2, max(level) as level
FROM cte
GROUP BY
 col1
;

这个SQL Fiddle适用于 SQL Server 2012,但我记得的 DB2 的语法是相同的。

编辑:

此外,您可以打开分层查询并使用CONNECT BY语法。

WITH cte AS (
SELECT CONNECT_BY_ROOT col1 as col1, col2 as col2
FROM table_a
START WITH col1='P1'
CONNECT BY PRIOR col2 = col1
 )
SELECT col1, MAX(col2) as col2
FROM cte
GROUP BY col1
;

下面的SQL Fiddle是针对 Oracle 的,但 DB2 应该是一样的。

于 2013-08-06T17:27:34.207 回答