これは、それ自体がおかしなことではありませんが、PostgreSQLがSELECTで複数のセットを返す関数を非常に奇妙に処理していることについてです。 リスト。セット-SELECTの関数を返す ANSISQL規格の一部ではありません。
LATERALを使用すると、動作が非常に簡単になります。 クエリ。FROMでセットを返す関数を使用するよりも優先されます。 可能な限り:
select a, b FROM unnest(array[1,2]) a, LATERAL unnest(array[1,2,3]) b;
例:
regress=> select a, b FROM unnest(array[1,2]) a, LATERAL unnest(array[1,2,3]) b;
a | b
---+---
1 | 1
1 | 2
1 | 3
2 | 1
2 | 2
2 | 3
(6 rows)
SELECTでまだ複数のセットを返す関数を使用しているのはこのときだけです 両方が同じ行数を返す関数の値をペアにしたいときです。その必要性は9.4でなくなり、複数の引数を持つunnest WITH ORDINALITYをサポートしています 。