Re: Set Returning Functions and joins
От | David Johnston |
---|---|
Тема | Re: Set Returning Functions and joins |
Дата | |
Msg-id | 6F0E1C4D-A56A-46D8-857E-278E4DA23E87@yahoo.com обсуждение исходный текст |
Ответ на | Set Returning Functions and joins (David Greco <David_Greco@harte-hanks.com>) |
Ответы |
Re: Set Returning Functions and joins
|
Список | pgsql-general |
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)
В списке pgsql-general по дате отправления: