【问题标题】:TSQL Recursive Concatenate Nested Navigation NamesTSQL 递归连接嵌套导航名称
【发布时间】:2016-03-02 22:41:58
【问题描述】:

好的,我试图在 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 工作原理的一些基本了解,但我遇到了一些让我很清楚的事情。任何帮助表示赞赏!

【问题讨论】:

    标签: tsql recursion common-table-expression


    【解决方案1】:

    您的问题不在于递归,而在于您的示例数据。没有父“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
    

    【讨论】:

    • 老实说:能够编写递归 CTE 的人肯定是愚蠢 :-) 快乐编码!
    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 2022-11-22
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多