2017-02-23 2 views
1

私は古いID番号を参照するID番号を持つテーブルを持っています。同じ表)。私が抱えている問題は、元のRecordIDに戻るために循環する必要のある未知数のレコードがあることです。例えば、データは次のようになります。...あなたのアイデアを得るテーブル内のID番号(fk)が同じテーブルの別のID番号(pk)を参照するパス(複数レコード)の選択

Column A | Column B | Column C 
----------+--------------+------------- 
1   | Books  | [NULL] 
2   | Music  | [NULL] 
3   | Hardcover | [Books] 
4   | Softcover | [Books] 
5   | Electronic | [Books] 
6   | CD   | [Music] 
7   | MP3   | [Music] 
8   | Rock   | [CD, Music] 
9   | Hard Rock | [Rock, CD, Music] 
10  | Classic Rock | [Rock, CD, Music] 
11  | Fiction  | [Softcover, Books] 
12  | Fiction  | [Hardcover, Books] 
13  | Non-Fiction | [Hardcover, Books] 
14  | Reference | [Non-Fiction, Hardcover, Books] 
15  | Biography | [Non-Fiction, Hardcover, Books] 

:だから

CategoryID | CategoryName | ParentCategory 
-----------+--------------+--------------- 
1   | Books  | NULL 
2   | Music  | NULL 
3   | Hardcover | 1 
4   | Softcover | 1 
5   | Electronic | 1 
6   | CD   | 2 
7   | MP3   | 2 
8   | Rock   | 6 
9   | Hard Rock | 6 
10   | Classic Rock | 6 
11   | Fiction  | 3 
12   | Fiction  | 4 
13   | Non-Fiction | 3 
14   | Reference | 13 
15   | Biography | 13 

、私の結果セットのようなものである必要があります。ループスルーするカテゴリは無限にあり、最初のレコードにヌル値を戻すパスを表示する必要があります。

私は、これが存在すれば、これを選択し、存在すれば次に選択し、XMLパスにマップされているかもしれませんが、文法とロジックに本当に苦労しています。これは起こる。ありがとう!

答えて

0

このような隣接リストリストで作業する場合、あなたは多くの場合、このように再帰的common table expressionsを使用する必要があります:

;with cte as (
select 
    t.* 
    , Path = convert(varchar(128),CategoryName) 
    , ParentPath = convert(varchar(128),null) 
from t 
where t.ParentCategory is null 
union all 
select 
    c.* 
    , [Path] = convert(varchar(128),p.Path + ', ' + c.CategoryName) 
    , ParentPath = p.Path 
    from t as c 
    inner join cte p 
     on c.ParentCategory = p.CategoryID 
    ) 
select 
    CategoryId 
    , CategoryName 
    , Path=quotename(ParentPath) 
from cte 
order by CategoryId 

テストのセットアップ:http://rextester.com/SSWK51498

リターン:

+------------+--------------+---------------------------------+ 
| CategoryId | CategoryName |    Path    | 
+------------+--------------+---------------------------------+ 
|   1 | Books  | NULL       | 
|   2 | Music  | NULL       | 
|   3 | Hardcover | [Books]       | 
|   4 | Softcover | [Books]       | 
|   5 | Electronic | [Books]       | 
|   6 | CD   | [Music]       | 
|   7 | MP3   | [Music]       | 
|   8 | Rock   | [Music, CD]      | 
|   9 | Hard Rock | [Music, CD]      | 
|   10 | Classic Rock | [Music, CD]      | 
|   11 | Fiction  | [Books, Hardcover]    | 
|   12 | Fiction  | [Books, Softcover]    | 
|   13 | Non-Fiction | [Books, Hardcover]    | 
|   14 | Reference | [Books, Hardcover, Non-Fiction] | 
|   15 | Biography | [Books, Hardcover, Non-Fiction] | 
+------------+--------------+---------------------------------+ 

参考文献:

関連する問題