加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – 递归地发现给定孩子的所有祖先

发布时间:2020-12-12 16:55:39 所属栏目:MsSql教程 来源:网络整理
导读:给定一个子代码,我需要返回一个包含该孩子的所有父母以及他们的父母的查询,直到找到父父母. 例如,给出这个数据: ID / Parent ID1 / 02 / 13 / 24 / 05 / 3 所以如果我通过了ID 5,我想得到一个查询与结果: ID / Parent ID1 / 02 / 13 / 2 这个表不适用于层次
给定一个子代码,我需要返回一个包含该孩子的所有父母以及他们的父母的查询,直到找到父父母.
例如,给出这个数据:
ID / Parent ID
1  /  0
2  /  1
3  /  2
4  /  0
5  /  3

所以如果我通过了ID 5,我想得到一个查询与结果:

ID / Parent ID
1  /  0
2  /  1
3  /  2

这个表不适用于层次结构类型,所以我怀疑这需要用CTE来完成,但是没有线索.如果可以在SQL查询/ proc中完成,任何帮助将不胜感激.

谢谢

解决方法

这或多或少是你想要的:
-- CTE to prepare hierarchical result set
;WITH #results AS
(
    SELECT  id,parentid 
    FROM    [table] 
    WHERE   id = @childId
    UNION ALL
    SELECT  t.id,t.parentid 
    FROM    [table] t
            INNER JOIN #results r ON r.parentid = t.id
)
SELECT  *
FROM    #results;

参考:

> CTE: Common Table Expression

工作实例:

-- create table with self lookup (parent id)
CREATE TABLE #tmp (id INT,parentid INT);

-- insert some test data
INSERT INTO #tmp (id,parentid) 
SELECT 1,0 UNION ALL SELECT 2,1 UNION ALL SELECT 3,2
UNION ALL SELECT 4,0 UNION ALL SELECT 5,3;

-- prepare the child item to look up
DECLARE @childId INT;
SET @childId = 5;

-- build the CTE
WITH #results AS
(
    SELECT  id,parentid 
    FROM    #tmp 
    WHERE id = @childId
    UNION ALL
    SELECT  t.id,t.parentid 
    FROM    #tmp t
            INNER JOIN #results r ON r.parentid = t.id
)

-- output the results
SELECT  * 
FROM    #results 
WHERE   id != @childId 
ORDER BY id;

-- cleanup
DROP TABLE #tmp;

输出:

1 | 02 | 13 | 2

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读