[英]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.