【问题标题】:How to write this SQL for linking data in DB2?如何编写这个 SQL 来链接 DB2 中的数据?
【发布时间】:2012-10-23 12:48:45
【问题描述】:

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

【问题讨论】:

  • 你让它变得更加困难(使用单个根会更容易)。您需要某种网络图(其他一些 DBMS 更好地支持这一点)。我假设你在LUW?哦,你能在链接中有循环吗?
  • 是的。它在LUW上,不会有循环(即表中同时出现001-002和002-001)。
  • 你能检查我对样本数据的预期输入/输出的编辑吗?我还在想,但这个更难......
  • 是的。我检查了编辑,这就是我所期望的。谢谢。如果您有任何想法,请随时在此处留言。 :)

标签: sql db2


【解决方案1】:

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

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 example,它必须使用 LEFT JOIN 样式的异常才能在 SQL Server 中工作)

产生预期的输出:

grp   leaf
=============
1     001 
1     002 
1     003 
1     006 
2     004 
2     005 
2     007 

【讨论】:

  • 感谢您的想法,但我收到以下错误:SQL0345N 递归公用表表达式“Recur”的全查询必须是两个或多个全查询的 UNION,并且不能包含列函数、GROUP BY 子句、 HAVING 子句、ORDER BY 子句或包含 ON 子句的显式连接。
  • 我已将 SQL 从“SELECT grp, Leaf, id2 FROM Recur JOIN Linked ON id1 = Leaf) 修改为“SELECT grp, Leaf, id2 FROM Recur, Linked where id1 = leaf) 我可以立即执行 SQL。
  • 这个 SQL 可以很好地用于上面的例子。但是当我在表中再添加一条记录时 - “001, 007”。预计001、002、003、004、005、006、007联动,但仍有2组。详细请看链接。 sqlfiddle.com/#!3/faf98/1
  • 请更新您的问题以包含您的 DB2 版本,该版本在我的 (V6R1) iSeries 上运行良好。还要在新示例中包含所需的结果(我假设您只有单向关系)。
猜你喜欢
  • 2015-08-03
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多