如何编写用于在DB2中链接数据的SQL?
例如,有两列-ID1和ID2相互链接。这些ID可能与表中的其他ID链接如何编写用于在DB2中链接数据的SQL?,sql,db2,Sql,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
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
另一方面,如果向表中添加了一条记录(008007)
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 Server中工作)
产生预期输出:
grp leaf
=============
1 001
1 002
1 003
1 006
2 004
2 005
2 007
感谢您的想法,但我得到了以下错误:SQL0345N递归公共表表达式“Recur”的fullselect必须是两个或多个fullselect的并集,不能包含列函数、GROUP BY子句、HAVING子句、ORDER BY子句或包含ON子句的显式联接。我已从“选择grp,leaf,id2 FROM Recur JOIN Linked ON id1=leaf)到“从Recur,Linked where id1=leaf中选择grp,leaf,id2 FROM Recur,Linked where id1=leaf),我现在就可以执行SQL了。对于上面的示例,这个SQL工作得很好。但是当我再添加一条记录时--001,007“到桌子上去。预计将链接001、002、003、004、005、006、007,但仍有2个组。请查看详细的链接。请更新您的问题,以包括您的DB2版本,该版本在我的(V6R1)iSeries上运行良好。在新示例中还包括了所需的结果(我假设您只有单向关系)。您已经使它变得更加困难(使用单个根会更容易)。您需要某种类型的网络图(其他一些DBMS更好地支持这一点)。我想你是在LUW?哦,你能在链接中有循环吗?是的。它在LUW上,不会有循环(即表中同时有001-002和002-001)。您能检查我对样本数据预期输入/输出的编辑吗?我还在想,但这个更难…是的。我已经检查了编辑,这是我所期望的。谢谢如果您有任何想法,请随时在此处留言。:)