美好的一天, 下面的代码定义了一个递归的自连接,很简单。但是,使用此方法我只能定义最多的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)
答案 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
;
带代码的
结果是:
╔════╦══════════╦═════════╦═══════╗
║ ID ║ ParentId ║ Name ║ Level ║
╠════╬══════════╬═════════╬═══════╣
║ 50 ║ 99 ║ Me ║ 1 ║
║ 99 ║ 1 ║ Dad ║ 2 ║
║ 1 ║ NULL ║ Grandpa ║ 3 ║
╚════╩══════════╩═════════╩═══════╝