2017-01-05 82 views
1

所以,我一直是這樣掙扎了幾個小時左右,現在SQL服務器 - 從兒童獲取父值遞歸

我正在寫一個腳本在一個不錯的格式來提取一些數據,我在使用另一個過程,但我不能完全弄清楚這個特定的位(我不使用SQL Server太多)

我有幾個表都參與這個腳本鏈接在一起,以獲取所有信息。所有這些表都只是用假數據和名稱,但它顯示了結構有望

tblCategories

cat_id cat_name 
1  Trousers 
2  Tracksuits 
3  Woolen 

tblCategoryHierarchy

ch_parentid ch_childid 
0   1 
1   2 
2   3 

我也得到了其在CAT_ID我的產品表它

tblProduct

p_id p_name  p_cat_id 
1  Red Trouser 3 

因此,我想顯示與tblProduct中鏈接的所有類別的產品ID,名稱和層次結構。

所以在這個例子中,它會顯示:

id name   cats 
1 Red Trouser Trousers > Tracksuits > Woolen 

希望有人能在這裏幫我一把!由於

+5

您正在尋找的術語是「遞歸cte」。這種類型的東西已經在SO和互聯網上的任何地方被回答了數百次。然後要獲得單個列中的類別列表,您將需要使用STUFF和FOR XML –

+0

https://stackoverflow.com/questions/tagged/sql-server+recursive-query –

回答

2

試試這個:

;WITH CTE AS (
    SELECT p.p_id AS id, p.p_cat_id, 1 AS level, 
      p.p_name, CAST(c.cat_name AS VARCHAR(200)) AS cat 
    FROM tblProduct AS p 
    JOIN tblCategories AS c ON p.p_cat_id = c.cat_id 

    UNION ALL 

    SELECT c.id, ch.ch_parentid AS cat_id, level = c.level + 1, 
      c.p_name, CAST(c2.cat_name AS VARCHAR(200)) AS cat 
    FROM tblCategoryHierarchy AS ch 
    JOIN CTE AS c ON ch.ch_childid = c.p_cat_id 
    JOIN tblCategories AS c2 ON ch.ch_parentid = c2.cat_id 
) 
SELECT id, p_name, 
     STUFF(REPLACE((SELECT CONCAT('>', cat) 
         FROM CTE 
         ORDER BY level DESC 
         FOR XML PATH('')), '>', '>'), 1, 1, '') AS cat 
FROM CTE 

查詢的遞歸部分返回從小孩到父級別的所有類別。該查詢使用FOR XML PATH爲了以逆向級別順序(即從父到子)連接類別名稱。

REPLACE被使用,因爲'>'字符從FOR XML PATH呈現爲'gt;'

+0

這工作得很好!我不得不稍微修改它,然後我發現我使用的數據具有指向它自己的孩子的類別,所以它被卡在一個循環中...哦!感謝代碼!接受的答案 – vxstorm