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

时间:2018-06-14 02:12:23

标签: sql postgresql cross-join generate-series set-returning-functions

我想生成(行,列)对的网格,如:

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)

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

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

1 个答案:

答案 0 :(得分:3)

将函数调用移至FROM子句:

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

升级到Postgres 10或更高版本,这种奇怪的行为终于改变了。详细解释:

逗号分隔的FROM项目是交叉加入的。参见: