TSQL 递归连接嵌套导航名称
TSQL Recursive Concatenate Nested Navigation Names
好的,我试图在 Whosebug 上找到适合我的示例,但找不到。我正在尝试递归连接 table 中每个节点的父节点,其中包含 parent/child 个节点。这是我目前所拥有的:
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”。尝试
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
好的,我试图在 Whosebug 上找到适合我的示例,但找不到。我正在尝试递归连接 table 中每个节点的父节点,其中包含 parent/child 个节点。这是我目前所拥有的:
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”。尝试
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