繁体   English   中英

如何编写这个SQL来链接DB2中的数据?

[英]How to write this SQL for linking data in DB2?

例如,有两列--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。

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

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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM