如何使用 generate_series() 生成值网格



我想生成一个(行,列(对的网格,例如:

1 | 1
1 | 2
1 | 3
...
2 | 1
2 | 2
...

我的天真方法有这样一个令人费解的行为:

select generate_series(1,5), generate_series(1, 5);
generate_series | generate_series
-----------------+-----------------
1 |               1
2 |               2
3 |               3
4 |               4
5 |               5
(5 rows)
select generate_series(1,5), generate_series(1, 4);
generate_series | generate_series
-----------------+-----------------
1 |               1
2 |               2
3 |               3
4 |               4
5 |               1
1 |               2
2 |               3
3 |               4
4 |               1
5 |               2
1 |               3
2 |               4
3 |               1
4 |               2
5 |               3
1 |               4
2 |               1
3 |               2
4 |               3
5 |               4
(20 rows)

它似乎重复每个系列,直到到达具有每个系列的最终值的行。

使用此函数作为与自身的交叉联接的正确方法是什么?

将函数调用移动到FROM子句:

SELECT *
FROM   generate_series(1,5) a
, generate_series(1,5) b;

或者升级到 Postgres 10 或更高版本,这种奇怪的行为最终得到了改变。详细说明:

  • SELECT 子句中多个集合返回函数的预期行为是什么?

逗号分隔的FROM项是交叉连接的。看:

  • 为什么此隐式联接的计划与显式联接不同?
  • [FROM x, y] 在 Postgres 中是什么意思?

相关内容

  • 没有找到相关文章

最新更新