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' )