0

例如,有两列 - ID1 和 ID2 相互链接。这些 ID 可能与表中的其他 ID 相关联。

ID1         ID2
------------------
001         002
001         003
004         005
002         006
005         007

上表中,001、002、003、006是联动的,004、005、007是联动的。

是否可以在 SQL for DB2 中查询此信息?

格式类似于以下:

Group       ID
--------------
1           001
1           002
1           003
1           006
2           004
2           005
2           007

另一方面,如果再向表中添加一条记录 (008, 007)

ID1         ID2
------------------
001         002
001         003
004         005
002         006
005         007
008         007  (Newly added)

预期结果将是:

Group       ID
--------------
1           001
1           002
1           003
1           006
2           004
2           005
2           007
2           008

因为 004, 005, 007, 008 是链接的。

DB2 版本是 9.7。

4

1 回答 1

2

你当然可以!它需要一个递归查询:

WITH Recur (grp, root, leaf) as (SELECT ROW_NUMBER() OVER(ORDER BY root.id1), 
                                        CAST(NULL as CHAR(3)), 
                                        root.id1
                                 FROM Linked as root
                                 EXCEPTION JOIN Linked as leaf
                                 ON leaf.id2 = root.id1
                                 GROUP BY root.id1
                                 UNION ALL 
                                 SELECT grp, leaf, id2
                                 FROM Recur 
                                 JOIN Linked
                                 ON id1 = leaf)

SELECT grp, leaf 
FROM Recur
ORDER BY grp, leaf

(在我的本地 iSeries 上测试,并且有一个有效的SQL Fiddle 示例,它必须使用LEFT JOIN-style 异常才能在 SQL Server 中工作)

产生预期的输出:

grp   leaf
=============
1     001 
1     002 
1     003 
1     006 
2     004 
2     005 
2     007 
于 2012-11-02T21:49:42.997 回答