Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 每个级别的ltree子级的总和_Sql_Postgresql_Ltree - Fatal编程技术网

Sql 每个级别的ltree子级的总和

Sql 每个级别的ltree子级的总和,sql,postgresql,ltree,Sql,Postgresql,Ltree,我有一个properties表,其中有一个ltree路径和name列。Ltree路径包含父节点的ID,即“7968.7969.7987.8000”。每个树节点都有带有一些数值的报告。我需要找到ltree中每个节点的子节点值之和。圆括号内的路径 (1) A | __________________________________ | | | (1.2)B (1

我有一个
properties
表,其中有一个ltree路径和name列。Ltree路径包含父节点的ID,即“7968.7969.7987.8000”。每个树节点都有带有一些数值的
报告
。我需要找到ltree中每个节点的子节点值之和。圆括号内的路径

        (1) A 
          |
     __________________________________
     |                |                |
(1.2)B            (1.3)C            (1.4)D
|
|________________________
        |                |
(1.2.5) E         (1.2.6) F
报告

property_id | value
    1       |   1 
    2       |   4
    3       |   19
    4       |   21
    5       |   9
    6       |   11
我需要找到像这样的smth

full_path | subtree_sum
   A      |     60     (1 + 4 + 19 + 21 + 9 + 11)
   A.B    |     24     (4 + 9 + 11)  
   A.C    |     19     (19)
   A.D    |     21     (21)
   A.B.E  |     9      (9)
   A.B.F  |     11     (11)
给你:

select 
    p.path,
    sum(r.value)
from properties p
left join properties sub on sub.path::text like p.path::text||'%'
left join reports r on r.property_id=sub.id
group by 1; 
它是如何工作的

对于查询
p
中调用的每个节点,我们通过加入
sub
来检索其所有子节点(包括自身)。为了加入,我们使用了
like
操作符,它允许我们使用
p
路径作为前缀。快速示例可以让您对
有一些了解,比如
运算符(
%
是通配符):

最后一步是将每个子节点与其值联接起来,求和并按第一列分组

编辑:

我对自己进行了一些教育,并找到了更好的解决方案:

select 
    p.path,
    sum(r.value)
from properties p
left join properties sub on sub.path <@ p.path
left join reports r on r.property_id=sub.id
group by 1; 
选择
p、 路径,
总和(r值)
从属性p

在子路径上左键连接子属性!小补丁:sub.path::varchar like(p.path::varchar | | |'%”)您能简单描述一下它是如何工作的吗?@Oleg_V我编辑了答案。如果需要额外的解释,请发表评论。谢谢,主要的误解是自我加入。p、 您需要修复类似于示例的查询,它们都是true@Oleg_V很抱歉误导了
类似的
示例。现在修好了。我还改进了我的解决方案。
select 
    p.path,
    sum(r.value)
from properties p
left join properties sub on sub.path <@ p.path
left join reports r on r.property_id=sub.id
group by 1;