PostgreSQL查询?

PostgreSQL查询?,postgresql,binary-tree,binary-search-tree,Postgresql,Binary Tree,Binary Search Tree,分贝 获取左侧当前节点正下方的所有节点 | ID| VALUE | Parent | Position | lft | rgt | |---|:------:|:-------:|:--------------:|:--------:|:--------:| | 1 | A | | | 1 | 12 | | 2 | B | 1 | L

分贝

获取左侧当前节点正下方的所有节点

| ID| VALUE  |  Parent |    Position    |   lft    |   rgt    |
|---|:------:|:-------:|:--------------:|:--------:|:--------:|
| 1 |   A    |         |                |     1    |    12    |
| 2 |   B    |    1    |        L       |     2    |    9     |
| 3 |   C    |    1    |        R       |     10   |    11    |
| 4 |   D    |    2    |        L       |     3    |    6     |
| 5 |   F    |    2    |        R       |     7    |    8     |
| 6 |   G    |    4    |        L       |     4    |    5     |
从“类别”中选择“类别”。*其中(“类别”。“位置”=“L”)和(“类别”。“lft”>=1和“类别”。“lft”<12)按“类别”。“lft”排序
输出{B,D,G}incorect

问题

当前节点正下方的节点如何位于左侧和右侧

输出lft{B,D,F,G}


输出rgt{C}

听起来像是在寻找类似于Oracle的CONNECT_BY语句的东西,该语句用于连接存储在平面表中的分层数据

碰巧有一种方法可以让Postgres做到这一点,使用

这是我提出的声明

SELECT "categories".* FROM "categories" WHERE ("categories"."position" = 'L') AND ("categories"."lft" >= 1 AND "categories"."lft" < 12) ORDER BY "categories"."lft"

下面是一个示例。

右/左的标准是什么?根据您发布的SQL,B、D、G是正确的。你想做什么?请解释您的目标。@hd1位置“L”=左“R”=右。@JimStewart当前节点正下方的节点在左侧和右侧是如何存在的?例子
WITH RECURSIVE sub_categories AS
(
    -- non-recursive term
    SELECT * FROM categories WHERE position IS NOT NULL

    UNION ALL

  -- recursive term
    SELECT c.*
    FROM
        categories AS c
    JOIN
        sub_categories AS sc
        ON (c.parent = sc.id)
)
SELECT DISTINCT categories.value 
FROM   categories, 
       sub_categories 
WHERE  ( categories.parent = sub_categories.id 
         AND sub_categories.position = 'L' ) 
        OR ( categories.parent = 1 
             AND categories.position = 'L' )