I’m porting some code from an Oracle application and we have many uses of set returning function. In particular, we are using them in joins of the form: CREATE TABLE dave ( id integer, field1 integer ); INSERT INTO dave VALUES (1, 10); SELECT id, g.* FROM dave INNER JOIN generate_series( 1, dave.field1 ) ON (1=1) In reality, the examples are not trivial like this, and the set returning function returns sets of records, not single values. Now, in the case of a LEFT JOIN and a function returning a setoff a simple value, I can rewrite it simply as: SELECT id, generate_series(1, dave.field1) FROM dave In the case of a LEFT JOIN and a function returning a setoff a record, I can rewrite it as: SELECT id, ( getRecord(1, dave.field1) ).* FROM dave I then figured I can rewrite INNER JOINs as: SELECT id, ( getRecord(1, dave.field1) ).* FROM dave WHERE Exists ( SELECT 1 FROM getRecord(1, dave.field1) ) Though I suppose this is running getRecord once for every row in dave, then another time for every row being returned. Now in some non-trivial examples involving multiple joins on set returning functions, this gets pretty complicated. Is there any alternative? Or I can suggest that a query the original form should be allowed? SELECT id, g.* FROM dave INNER JOIN generate_series( 1, dave.field1 ) ON (1=1) |