2017-02-23 131 views
1

我有一個ID號表引用舊的ID號(外鍵引用主鍵在同一張桌子)。我遇到的問題是需要循環回到原始RecordID的未知數量的記錄。例如,數據可能看起來像:選擇表中的ID號(fk)引用同一表中的另一個ID號(pk)的路徑(多個記錄)

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 

所以,我的結果集需要是這樣的:

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] 

...你的想法。我可以有無限數量的類別循環訪問,並需要用空值顯示返回第一條記錄的路徑。

我知道我需要某種情況和循環,如果存在,然後選擇這個,如果存在然後選擇下一個,可能有它映射到一個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] | 
+------------+--------------+---------------------------------+ 

參考文獻:

相關問題