如何将 table 的每一行扩展到 Postgresql 中的可变行数
How to expand each row of a table into a variable number of rows in Postgresql
我有一个 table 定义具有给定迭代次数的对象,假设这是一个回合数可变的游戏。
# select * from game;
game_id | num_rounds
--------+-----------
A | 2
B | 3
C | 1
我想创建一个 select 语句来生成一个 table 每个游戏每轮一行。
# select ???;
game_id | round_number
--------+-------------
A | 1
A | 2
B | 1
B | 2
B | 3
C | 1
在 generate_series
上使用最大长度的连接可以完成这项工作。
select
game_id,
generate_series as round_number
from game
join generate_series(1, (select max(num_rounds) from game))
on generate_series <= num_rounds
generate_series()
中不需要子查询和联接。横向连接更简单、更高效:
select g.game_id, s.round_number
from game g
cross join lateral generate_series(1, g.num_rounds) as s(round_number)
order by g.game_id, s.round_number
我有一个 table 定义具有给定迭代次数的对象,假设这是一个回合数可变的游戏。
# select * from game;
game_id | num_rounds
--------+-----------
A | 2
B | 3
C | 1
我想创建一个 select 语句来生成一个 table 每个游戏每轮一行。
# select ???;
game_id | round_number
--------+-------------
A | 1
A | 2
B | 1
B | 2
B | 3
C | 1
在 generate_series
上使用最大长度的连接可以完成这项工作。
select
game_id,
generate_series as round_number
from game
join generate_series(1, (select max(num_rounds) from game))
on generate_series <= num_rounds
generate_series()
中不需要子查询和联接。横向连接更简单、更高效:
select g.game_id, s.round_number
from game g
cross join lateral generate_series(1, g.num_rounds) as s(round_number)
order by g.game_id, s.round_number