TSQL递归连接嵌套导航名称

TSQL递归连接嵌套导航名称,tsql,recursion,common-table-expression,Tsql,Recursion,Common Table Expression,好的,我试图找到一个对我有效的stackoverflow示例,但我找不到。我试图在一个包含父/子节点的表中递归地连接每个节点的父节点。以下是我到目前为止的情况: 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_EXA

好的,我试图找到一个对我有效的stackoverflow示例,但我找不到。我试图在一个包含父/子节点的表中递归地连接每个节点的父节点。以下是我到目前为止的情况:

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的工作原理缺乏一些基本的了解,但我遇到了一些让我明白的东西。感谢您的帮助

问题不在于递归,而在于示例数据。没有父级“3”。试一试

只是尝试了一下:它会返回你想要的结果,除了“NAV_PARENT_NAME”下的第一个“银河”。改变这个

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


问题不在于递归,而在于示例数据。没有父级“3”。试一试

只是尝试了一下:它会返回你想要的结果,除了“NAV_PARENT_NAME”下的第一个“银河”。改变这个

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


老实说:一个能够编写递归CTE的人肯定不愚蠢:-)快乐的编码!老实说:一个能够编写递归CTE的人肯定不愚蠢:-)快乐的编码!
CAST(NAV_NAME AS VARCHAR(MAX)) AS NAV_PARENT_NAME