2016-03-02 19 views
1

好吧,我試圖在stackoverflow上找到一個適用於我的例子,但我無法找到它。我試圖遞歸地連接每個節點的父節點在一個擁有父節點/子節點的表中。以下是我迄今爲止:TSQL遞歸連接嵌套導航名稱

CREATE TABLE #TBL_EXAMPLE (
    PARENT_NAV_ID INT, 
    NAV_ID INT, 
    NAV_NAME VARCHAR(25) 
) 

INSERT INTO #TBL_EXAMPLE VALUES(NULL, 1, 'MILKY WAY') 
INSERT INTO #TBL_EXAMPLE VALUES(1, 2, 'SOLAR SYSTEM') 
INSERT INTO #TBL_EXAMPLE VALUES(3, 4, 'EARTH') 
INSERT INTO #TBL_EXAMPLE VALUES(4, 5, 'ANTARCTICA') 

; WITH #EXAMPLE_CTE AS (
    SELECT 
     PARENT_NAV_ID, 
     NAV_ID, 
     NAV_NAME, 
     CAST('' AS VARCHAR(MAX)) AS NAV_PARENT_NAME 
    FROM #TBL_EXAMPLE 
     WHERE PARENT_NAV_ID IS NULL 
    UNION ALL 

    SELECT 
     EXMP.PARENT_NAV_ID, 
     EXMP.NAV_ID, 
     EXMP.NAV_NAME, 
     CT.NAV_PARENT_NAME + '/' + EXMP.NAV_NAME AS PARENT_NAV_NAME 
    FROM #TBL_EXAMPLE EXMP 
     INNER JOIN #EXAMPLE_CTE CT ON EXMP.PARENT_NAV_ID = CT.NAV_ID 
) 
SELECT 
* 
FROM #EXAMPLE_CTE 

我得到的是這樣的:

PARENT_NAV_ID NAV_ID NAV_NAME  NAV_PARENT_NAME 
NULL   1  MILKY WAY 
1    2  SOLAR SYSTEM /SOLAR SYSTEM 

我想這樣什麼:

PARENT_NAV_ID NAV_ID NAV_NAME  NAV_PARENT_NAME 
NULL   1  MILKY WAY  MILKY WAY 
1    2  SOLAR SYSTEM MILKY WAY/SOLAR SYSTEM 
3    4  EARTH   MILKY WAY/SOLAR SYSTEM/EARTH 
4    5  ANTARCTICA  MILKY WAY/SOLAR SYSTEM/EARTH/ANTARCTICA 

我知道我缺少的一些基本認識CTE如何工作,但我遇到了一些讓我明白的東西。任何幫助表示讚賞!

回答

0

您的問題不在於遞歸,而在您的示例數據中。沒有父母「3」。嘗試

INSERT INTO #TBL_EXAMPLE VALUES(NULL, 1, 'MILKY WAY') 
INSERT INTO #TBL_EXAMPLE VALUES(1, 2, 'SOLAR SYSTEM') 
INSERT INTO #TBL_EXAMPLE VALUES(2, 3, 'EARTH') 
INSERT INTO #TBL_EXAMPLE VALUES(3, 4, 'ANTARCTICA') 

剛剛試過它:它帶着你想要的結果回來,除了「NAV_PARENT_NAME」下的第一個「MILKY WAY」。改變這種

CAST('' AS VARCHAR(MAX)) AS NAV_PARENT_NAME 

CAST(NAV_NAME AS VARCHAR(MAX)) AS NAV_PARENT_NAME 
+0

哇,我覺得愚蠢。謝謝! –

+0

沒關係,我添加了一個微小的編輯... – Shnugo

+0

說實話:一個人能夠寫遞歸CTEs肯定是**不**:愚蠢:-)快樂的編碼! – Shnugo