0

列が 1 つしかないテーブル RD があります。

-----
rd_id
-----
3 
2 
6 
7 
8 

2 つの列を持つテーブル DL があり、このテーブルに格納されている階層があります。

----------------------
dl_id     dl_parent
----------------------
1         2               
2         Null
3         Null
4         6
6         7
7         8
8         Null

問題は、RD テーブルのメンバーを使用して DL テーブルから階層を取得する方法です。結果は次のようになります。

--------------
rd_id   dl_id
--------------
3         3

2         2

6         6
6         7
6         8

7         7
8         8

8         8

私は金曜日からこの問題に取り組んできましたが、まだ解決できません。Common Table Expression を使用して、1 つの値から再帰をトラバースできることを知っています (例のように、入力 6 で 1 つの関数を作成し、6,7,8 を生成します)。複数値(rd_id)の使い方がわかりません。

アイデアはありますか?

4

2 に答える 2

1

これにより、正しい結果が得られます。データ設定:

declare @RD table (rd_id int not null)
insert into @RD(rd_id) values
(3),
(2),
(6),
(7),
(8)

declare @DL table (dl_id int not null,dl_parent int null)
insert into @DL(dl_id,dl_parent) values
(1,2),          
(2,Null),
(3,Null),
(4,6),
(6,7),
(7,8),
(8,Null)

そしてクエリ:

;with AllValues as (
    select rd_id,rd_id as dl_id from @RD
    union all
    select rd_id,dl_parent
    from AllValues av
        inner join
        @DL dl
            on
                av.dl_id = dl.dl_id
    where
        dl.dl_parent is not null
)
select * from AllValues

結果:

rd_id       dl_id
----------- -----------
3           3
2           2
6           6
7           7
8           8
7           8
6           7
6           8

説明:

CTE のアンカーではrd_id@RDテーブルから 2 回選択するだけです。サンプルは、すべての入力行が両方の列に同じ値を持つ出力行を生成する必要があることを意味するためです。

@DL次に、2 番目の列に基づいて、見つかった一致する親行のテーブルに結合します。親が見つかったら、新しい行を作成し、親の値を 2 番目の列に代入します。これは、新しい行が生成されなくなるまで続きます。

于 2012-09-17T09:23:17.857 に答える
0

次のような再帰クエリを作成するには、オンザフライ ビューを使用する必要があります。

with n as (
select dl_id, dl_id as ancestor
from dbo.dl
union all
select np1.dl_id, n.ancestor
from dl as np1 , n
where n.dl_id = np1.dl_parent)
select * from n
where dl_id in (select rd_id from rd)
order by dl_id, ancestor
于 2012-09-17T09:26:27.170 に答える