0

たとえば、互いにリンクされている ID1 と ID2 の 2 つの列があります。ID がテーブル内の他の ID とリンクされている可能性があります。

ID1         ID2
------------------
001         002
001         003
004         005
002         006
005         007

上記の表では、001、002、003、006 が連結され、004、005、007 が連結されています。

DB2 の SQL でこの情報を照会することは可能ですか?

形式は次のようになります。

Group       ID
--------------
1           001
1           002
1           003
1           006
2           004
2           005
2           007

一方、テーブルにもう 1 つのレコード (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 です。

4

1 に答える 1

2

できますよ!再帰クエリが必要です。

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があり、SQL Server で動作するには -style 例外を使用する必要があります)

予想される出力が得られます。

grp   leaf
=============
1     001 
1     002 
1     003 
1     006 
2     004 
2     005 
2     007 
于 2012-11-02T21:49:42.997 に答える