sql - 递归添加多行

标签 sql postgresql

我有一个名为river 的表,其中包含三列:nameriverlength

name 是河流的名称,river 是这条河流所连接的河流,length 是河流的长度

示例表可能如下所示:

name       | river      | length
           |            |  
Amazonas   |            | 3778
Rio negro  | Amazonas   | 2886
Huallaga   | Rio Negro  | 1138
Nile       |            | 3090
White Nile | Sobat      | 950
Sobat      | White Nile | 740

我想递归将我在这里完成的河流的长度加在一起:

with recursive cte as(
select name, river,length from river
where name = 'Amazonas'
Union all
select r.name,r.river,r.length from river r
join cte s on r.river = s.name
)
select sum(length) from cte;

但是我也希望能够将不同的父河流加在一起并像这样对它们进行相应的分组:

name       combined_length
Amazonas | 7802
Nile     | 6203
Volga    | 6234

我已经尝试将 语句添加到上面的代码中,如下所示:

where name = 'Amazonas' or name = 'Nile' or name = 'Volga'

但是我无法按它们的父级对它们进行分组,我只能将每条河流的所有长度加在一起(亚马逊河、尼罗河和伏尔加河的总和),或者如果我尝试使用分组依据则根本不添加它们。

我还尝试使用以下三个不同的子查询:

length from river
where name = 'Amazonas'
Union all
select r.name,r.river,r.length from river r
join cte s on r.river = s.name

并用我想要的河流替换名称,但随后出现错误:

recursive query "cte" does not have the form non-recursive-term UNION [ALL] recursive-term

最佳答案

我期待这样的事情来获得所有父河流的长度:

with recursive cte as (
      select name, river, length, name as parent
      from river r
      where r.river is null
      union all
      select r.name, r.river, r.length, cte.parent
      from river r join
           cte s
           on r.river = s.name
     )
select parent, sum(length)
from cte
group by parent;

关于sql - 递归添加多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48720265/

相关文章:

java - 没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。 -- Netbeans、Postgresql 8.4 和 Glassfish

c# - 无法通过控制台应用程序插入数据库

php - MySQL INSERT 查询有效,但未插入数据

sql - 在 Redshift 中使用 json_extract_path_text 时如何跳过错误?

sql - 使用 CURRENT_TIMESTAMP 查询时间戳分区表的效率

linux - Elastic Beanstalk 上的 PostgreSQL (Amazon Linux 2)

MySQL 命名约定

sql - 如何让SQL Server忽略检查?

python - 即使启动它的 lambda 函数超时,如何使复制命令继续在 Redshift 中运行?

ruby-on-rails - 由于 "Please install the postgresql adapter"错误,在新创建的不使用 postgres 的应用程序中,Rails 控制台无法打开