递归Self JOIN SSMS但定义最低节点

时间:2018-01-29 14:51:39

标签: sql sql-server

美好的一天, 下面的代码定义了一个递归的自连接,很简单。但是,使用此方法我只能定义最多的parentNode。就我而言,我希望能够识别出最多的子节点,并能够看到他所有的父母。

WITH q AS 
(
    SELECT * FROM [QA].[Node]
    WHERE ParentNodeID IS NULL -- This is where we define the most parent ID
    UNION ALL
    SELECT  m.* FROM [QA].[Node] m
        INNER JOIN q ON m.ParentNodeID = q.ID
    )
SELECT * FROM q

有人可以帮助我:)非常感谢。我希望能够定义let say,给查询一个id为7,并让查询按顺序返回,从最父节点开始,我们给出的节点是最后一个条目。

例如,如果表是ancestroy,并且我们有一个列引用其自我标识人爸爸。

如果我告诉查询,我希望结果回来,' WHERE ID = 50'

ID, ParentId, Name
(1, NULL, Grandpa),
(99, 1, Dad),
(50, 99, Me)

2 个答案:

答案 0 :(得分:2)

这是一个简单的例子

DECLARE @mockup TABLE(ID INT, ParentId INT, Name VARCHAR(100));
INSERT INTO @mockup VALUES
(1, NULL, 'Grandpa'),
(99, 1, 'Dad'),
(50, 99, 'Me');

DECLARE @StartForBottomUp INT=50;

WITH recCTE AS
(
    SELECT * FROM @mockup WHERE ID=@StartForBottomUp
    UNION ALL
    SELECT m.*
    FROM @mockup AS m
    INNER JOIN recCTE AS r ON m.ID=r.ParentId
)
SELECT * FROM recCTE ;

我在具有给定ID的项目处启动锚点部分并向上移动链。

答案 1 :(得分:1)

这是你应该使用的递归CTE:

WITH q AS
(
    SELECT ID OriginalID, ID, ParentId, [Name], 1 [Level]
    FROM dbo.YourTable
    UNION ALL
    SELECT q.OriginalID, t.ID, t.ParentId, t.[Name], [Level] + 1
    FROM q
    INNER JOIN dbo.YourTable t
        ON q.ParentId = t.ID
)
SELECT ID, ParentId, [Name], [Level]
FROM q
WHERE OriginalID = 50
;
带代码的

Here is a live demo

结果是:

╔════╦══════════╦═════════╦═══════╗
║ ID ║ ParentId ║  Name   ║ Level ║
╠════╬══════════╬═════════╬═══════╣
║ 50 ║ 99       ║ Me      ║     1 ║
║ 99 ║ 1        ║ Dad     ║     2 ║
║  1 ║ NULL     ║ Grandpa ║     3 ║
╚════╩══════════╩═════════╩═══════╝