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
包含重复项。