您可以使用递归 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 应该是一样的。