Join on Function Returning Type

Manchmal ist es praktisch Daten aus einer Funktion mit den Spalten einer Tabelle / Abfrage zu kombinieren.
Die Herausforderung liegt darin, die Werte aus der Tabelle der Funktion passend pro Record als Parameter zu übergeben.
In PostgreSQL ab Version 9.3 kann dazu der Lateral Join verwendet werden, für Versionen davor ist aber eine andere Variante notwendig.
Beispieldaten:


Create table angebote (angebotsid integer, kundenid integer, gueltigab date);
insert into angebote values 
(1, 4711, '2015-01-01'),
(2, 4711, '2015-03-01'),
(3, 4711, '2015-05-01');
Create Type typePreis as (wert numeric(6,2), gueltigab date);
Create Function get_preis(inAngebotsid integer, inGueltigam date) Returns typePreis as $$
Declare
  p typePreis;
Begin
  --Dummydaten statt wirklicher Preisermittlung
  p.wert := 9.99 * inAngebotsid;
  p.gueltigab := inGueltigam;
  Return p;
End;
$$
LANGUAGE plpgsql;

Mit einer Unterabfrage gelingt der Trick, den zurückgegebenen Record der Funktion in der select-Liste zu verwerten. In der übergeordneten Abfrage wird auf die Funktion mithilfe der Klammer um den Alias referenziert.


select angebotsid, (p).*
  from (select angebotsid, get_preis(angebotsid, gueltigab) as p 
          from angebote) sub

Oder ausführlich referenziert:


select sub.angebotsid, (sub.p).wert, (sub.p).gueltigab
  from (select angebotsid, get_preis(angebotsid, gueltigab) as p 
          from angebote) sub

Siehe dazu auch:
stackoverflow.com