2012-09-17 127 views
0

我有臺RD只有一個列:如何從SQL Server的多個值獲取層次結構?

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

我有表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 

我一直勞作與週五這個問題仍然不能得到它的裂紋。 我知道我可以使用公用表表達式來遍歷來自一個值的遞歸(例如用輸入6創建一個函數併產生6,7,8)。 但我不知道如何使用多個值(rd_id)。

有一些想法嗎?

+1

' dl_id'等於結果表中相同的'dl_id'嗎?不應該沒有父母身份證?就像'3 3','2 2','8 8' –

+0

嗨Gamal,這是來自領域專家的商業規則。因爲這是與維度級別及其屬性相關的商業智能案例。但感謝您的反饋:) – Awan

回答

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選擇rd_id表兩次 - 因爲您的示例意味着每個輸入行應該產生兩列中具有相同值的輸出行。

然後,我們根據第二列爲任何匹配的父行添加@DL表。如果我們找到父項,那麼我們會生成一個新的行,將父項值替換爲第二列。這一直持續到沒有新的行產生。

+0

謝謝你的答案和解釋達米恩:) 它給查看問題提供了新的視角。 再次感謝! – Awan

0

你必須使用對即時視圖來創建這樣一個遞歸查詢:你爲什麼想了`dl_id`與`dl_parent` =`NULL`要與

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 
+0

動態視圖,很酷...對我來說這是新事物。 非常感謝Ecarry :) – Awan

+0

如果你喜歡它,請將它投票:) –