Ste*_*ett 3 sql postgresql cross-join generate-series set-returning-functions
我想生成一个(行,列)对的网格,例如:
1 | 1
1 | 2
1 | 3
...
2 | 1
2 | 2
...
Run Code Online (Sandbox Code Playgroud)
我天真的方法有这种令人费解的行为:
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)
Run Code Online (Sandbox Code Playgroud)
似乎重复每个系列,直到到达具有每个系列最终值的行。
使用此函数作为与自身交叉连接的正确方法是什么?
将函数调用移至FROM子句:
SELECT *
FROM generate_series(1,5) a
, generate_series(1,5) b;
Run Code Online (Sandbox Code Playgroud)
或者升级到 Postgres 10 或更高版本,最终改变了这种奇怪的行为。详细解释:
逗号分隔的FROM项目是交叉连接的。看: