Tabellenfunktionen verketten

Sie können eine Abfrage erstellen, mit der eine Tabellenfunktion aufgerufen wird, für die eine Korrelation mit einer anderen Tabellenfunktion ausgeführt wird. Dieser Vorgang wird als Verkettung von Tabellenfunktionen bezeichnet.

Die Ergebnisse des ersten Aufrufs der UDTF (User-Defined Table Function; benutzerdefinierte Tabellenfunktion) können als Eingabe nachfolgender UDTFs für weiterführende Verarbeitungsoperationen verwendet werden. In der folgenden Abfrage wird beispielsweise dargestellt, wie die Ergebnisse einer Korrelation einer weiteren Korrelation zugeführt werden:
mydb.schema(usr1)=> SELECT t.order_id, t.prod_codes, f.product_id, 
x.product_id FROM orders t JOIN TABLE(parseNames(prod_codes)) AS f ON 
TRUE JOIN TABLE (parseNames(f.product_id)) x ON TRUE ORDER BY 
order_id;
Um das Verhalten der Kette korrelierter Funktionen zu ermitteln, kann es nützlich sein, die Abfrage in einzelne Teile aufzugliedern und die Ergebnisse dieser Teile einzeln zu untersuchen. Als erster "Teil" kann beispielsweise die Abfrage herangezogen werden, mit der ein Join zwischen der Auftragstabelle und der UDTF parseNames wie folgt hergestellt wird. Aus Gründen der Übersichtlichkeit werden in der Ausgabe nur die Ergebnisse für die ersten beiden Auftrags-IDs (120 und 124) dargestellt:
mydb.schema(usr1)=> SELECT t.order_id, t.prod_codes, f.product_id FROM orders 
t JOIN TABLE(parseNames(prod_codes)) AS f ON TRUE ORDER BY order_id; 
 ORDER_ID |      PROD_CODES       | PRODUCT_ID
----------+-----------------------+------------
      120 | 28,36,80              | 28
      120 | 28,36,80              | 36
      120 | 28,36,80              | 80
      124 | 124,6,12,121          | 124
      124 | 124,6,12,121          | 6
      124 | 124,6,12,121          | 12
      124 | 124,6,12,121          | 121
...
(34 rows)
Wie in der Ausgabe ersichtlich, gibt die UDTF parseNames eine Tabelle mit einer Zeile für jeden eindeutigen Wert in der Zeichenfolge mit den Werten für 'prod_codes' zurück. Dieses Ausgangsergebnisset wird für den nächsten Join bereitgestellt, mit dem die Funktion parseNames für jeden eindeutigen Wert in der Spalte 'f.product_id' wie folgt aufgerufen wird:
mydb.schema(usr1)=> SELECT t.order_id, t.prod_codes, f.product_id, 
x.product_id FROM orders t JOIN TABLE(parseNames(prod_codes)) AS f ON 
TRUE JOIN TABLE (parseNames(f.product_id)) x ON TRUE ORDER BY 
order_id;
 ORDER_ID |      PROD_CODES       | PRODUCT_ID | PRODUCT_ID
----------+-----------------------+------------+------------
      120 | 28,36,80              | 28         | 28
      120 | 28,36,80              | 36         | 36
      120 | 28,36,80              | 80         | 80
      124 | 124,6,12,121          | 124        | 124
      124 | 124,6,12,121          | 6          | 6
      124 | 124,6,12,121          | 12         | 12
      124 | 124,6,12,121          | 121        | 121
...
(34 rows)