2016-03-02 77 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