sql server如何从树中的任何子节点到祖先检索所有节点?

| 在这个答案中,我问如何获取所有子节点,以及如何引用根节点。现在我意识到我也需要相反的情况: 我想拥有所有节点和所有父母。 所以在这个简单的树中:
1 - 2 - 3

    L - 4 - 5

        L - 6

7 - 8
我想拥有
1 1;
2 2;
2 1;
3 3;
3 2;
3 1;
4 4;
4 2;
4 1;
5 5;
5 4;
5 2;
5 1;
6 6;
6 4;
6 2;
6 1;
7 7;
8 8;
8 7;
(顺序不重要) 这是获取相反查询的查询(从父级获取所有子级)。我尝试使用它,但是找不到解决方案。你能建议吗?
-- get all childs of all parents
WITH    q AS
        (
        SELECT  ID_CUSTOMER, ID_CUSTOMER AS root_customer
        FROM    CUSTOMERS c
        UNION ALL
        SELECT  c.ID_CUSTOMER, q.root_customer
        FROM    q
        JOIN    CUSTOMERS c 
        ON      c.ID_PARENT_CUSTOMER = q.ID_CUSTOMER
        )
SELECT  *
FROM    q
已邀请:
该查询将生成一个
transitive closure
邻接表:所有祖先后裔对的列表。 由于它将为每个祖先返回所有后代,因此情况也相反:对于每个后代,它将返回其所有祖先。 因此,此查询确实会返回所有可能的组合,而与遍历顺序无关:无论是将父级连接到子级还是相反,这都无关紧要。 让我们测试一下:
WITH    customers (id_customer, id_parent_customer) AS
        (
        SELECT  *
        FROM    (
                VALUES  (1, NULL),
                        (2, 1),
                        (3, 2),
                        (4, 2),
                        (5, 4),
                        (6, 4),
                        (7, NULL),
                        (8, 7)
                ) t (a, b)
        ),
        q AS
        (
        SELECT  ID_CUSTOMER, ID_CUSTOMER AS root_customer
        FROM    CUSTOMERS c
        UNION ALL
        SELECT  c.ID_CUSTOMER, q.root_customer
        FROM    q
        JOIN    CUSTOMERS c 
        ON      c.ID_PARENT_CUSTOMER = q.ID_CUSTOMER
        )
SELECT  *
FROM    q
ORDER BY
        id_customer, root_customer DESC
with q (
select id_customer, id_parent_customer from customers
union all
select id_customer, id_parent_customer from customers
join q on customers.id_parent_customer = q.id_customer
) select * from q

要回复问题请先登录注册