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

标签 sql-server tsql recursive-query

this answer我问如何获取所有子节点以及对根节点的引用。现在我意识到我还需要相反的东西:

我想要所有的节点和所有的父节点。

所以在这个简单的树中:

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

最佳答案

此查询构建邻接列表的传递闭包:所有祖先-后代对的列表。

由于它将返回每个祖先的所有后代,反之亦然:对于每个后代,它将返回其所有祖先。

所以这个查询确实会返回所有可能的组合,而不管遍历顺序如何:无论您是将 parent 连接到 child 还是相反。

让我们测试一下:

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

关于sql-server - sql server如何检索树中从任何 child 到祖先的所有节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5716968/

相关文章:

返回每个 ID 的最新记录的 SQL 查询

performance - 递归 CTE 导致缓慢和索引扫描

sql - SQL Server 中的字母数字序列

c# - 无法使用 Linq 插入到 SQL Server Always Encrypted 表中

sql - 在 TSQL 中搜索不存在节点的 xml 的更好方法

tsql - 在 where 子句中使用 T-SQL 中的 CASE?

sql - 在单个查询中对记录进行分层检索

sql - PostgreSQL 中按数组重叠分组

php - 从 table1 中选择 3 个值并使用 table2 中 table1 中的一个值来获取结果?

sql-server - 更新 : The UPDATE statement conflicted with the FOREIGN KEY constraint 时出现 Sql 错误