查询邻接列表中最远的孩子

Ove*_*rdQ 6 sql postgresql recursive-query adjacency-list

所以我有一个SQL查询来检索邻接列表中给定节点的所有子节点.

WITH    RECURSIVE
        q AS
        (
        SELECT  id, name
        FROM    categories h
        WHERE   id = 11846801
        UNION ALL
        SELECT  hc.id, hc.name
        FROM    q
        JOIN    categories hc
        ON      hc.parent = q.id
        )
SELECT  name
FROM    q
Run Code Online (Sandbox Code Playgroud)

有没有修改该查询返回我的方式只是节点的最底层?我不能只指定给定的级别,因为每条路径可能有不同的深度.

Erw*_*ter 3

解读1

“从一开始,所有节点都会留下最长的路径。”

一种方法是计算向下的级别,并仅返回底部级别的成员:

WITH RECURSIVE q AS (
   SELECT  id, name, 0 AS lvl
   FROM    categories
   WHERE   id = 11846801

   UNION ALL
   SELECT  c.id, c.name, q.lvl + 1
   FROM    q
   JOIN    categories c ON c.parent = q.id
   )
SELECT  id, name
FROM    q
WHERE   lvl = (SELECT max(lvl) FROM q);
Run Code Online (Sandbox Code Playgroud)

解读2

“全部离开节点。”

WITH RECURSIVE q AS (
   SELECT  id, name, parent
   FROM    categories
   WHERE   id = 11846801

   UNION ALL
   SELECT  c.id, c.name, c.parent
   FROM    q
   JOIN    categories c ON c.parent = q.id
   )
SELECT  id, name
FROM    q
WHERE   NOT EXISTS (SELECT FROM q q1 WHERE q1.parent = q.id);
Run Code Online (Sandbox Code Playgroud)

检查应该q比基表更快 - 除非 q 很大,在这种情况下主表上的索引可能会更快。