Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写用于在DB2中链接数据的SQL?_Sql_Db2 - Fatal编程技术网

如何编写用于在DB2中链接数据的SQL?

如何编写用于在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相互链接。这些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
另一方面,如果向表中添加了一条记录(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)。您能检查我对样本数据预期输入/输出的编辑吗?我还在想,但这个更难…是的。我已经检查了编辑,这是我所期望的。谢谢如果您有任何想法,请随时在此处留言。:)