create table flight_costs as
  with
    costs(day, curr, prev) as (
      select 1, 20, 0 union
      select 1.5, 30, 20 UNION
      select 3, 40, 30 UNION
      select day + 1, (curr + prev)/2 + ((day + 1) % 7) * 5, curr from costs
      where day < 2500 and day > 1
  )
  select day as day, curr as price from costs;


将返回4999行数据。这对我来说很有意义,因为基本情况是

select 1.5, 30, 20 UNION
select 3, 40, 30 UNION


但是,我不明白为什么

create table flight_costs as
  with
    costs(day, curr, prev) as (
      select 1, 20, 0 union
      select 2, 30, 20 UNION
      select 3, 40, 30 UNION
      select day + 1, (curr + prev)/2 + ((day + 1) % 7) * 5, curr from costs
      where day < 2500 and day > 1
  )
  select day as day, curr as price from costs;


只会返回我2500行

select 2, 30, 20 UNION
select 3, 40, 30 UNION


应该循环通过,并返回


1
2
3
3
4
4
5
5
6 ....


而不是


1
2
3
4
5
6 ....

最佳答案

我的猜测是UNION正在消除重复项。

例如:select day + 1, (curr + prev)/2 + ((day + 1) % 7) * 5, curr from costs表示(2, 30, 20)会产生(3, 40, 30);这将产生与从递归调用的初始(3,40,30)产生的所有结果完全相同的结果。

...但是,这的确使我感到奇怪,为什么第一个查询只有4999行;它应该从最初的1行开始有2500,从最初的1.5行开始有2499,从最初的3行开始有2498。第3行和第1行的后代可能会收敛,但是由于那显然不是立即的,所以总数仍应远远超过4999。

您可以使用UNION ALL包含重复项。

08-27 16:26