SELECT ROW -- record type has not been registered

Hiho … ein neues Problem bei dem ich nicht weiter komme :confused:

Ich verwende mal die gleiche Ausgangslage wie gestern

test=# SELECT * FROM tbl_a;
 id | name  | ort
----+-------+-----
  1 | Name1 | Ort
  2 | Name2 | Ort
(2 rows)

test=# SELECT * FROM tbl_b;
 id | a_id |   datum    |   extra
----+------+------------+-----------
  1 |    1 | 2009-01-01 | Apfel
  2 |    1 | 2009-01-02 | Birne
  3 |    1 | 2009-01-03 | Kartoffel
  4 |    2 | 2009-01-02 | Möhre
  5 |    2 | 2009-01-04 | Pfirsich
(5 rows)

Bei folgender Abfrage erhalte ich den im Titel stehenden Fehler:

SELECT tbl_a.name, sub_b.a_id, (specrow).datum FROM
  (SELECT a_id, (SELECT ROW(datum) FROM tbl_b) AS specrow FROM tbl_b ) AS sub_b
  JOIN tbl_a ON tbl_a.id = sub_b.a_id;

(ERROR: record type has not been registered)

In der endgültigen Abfrage habe ich in specrow natürlich mehrere Spalten und greife auf eine andere Tabelle zu aus der ich mir eine Zeile passend zur a_id hole.

Jetzt bleibt nur noch die Frage wie ich auf die spalten des record zugreifen kann oder muss ich dafür extra einen eigenen Typen anlegen?

Was willst Du denn erreichen, also was soll als Resultat rauskommen?


Andreas

Sorry das ich erst jetzt antworte, musste gestern unverhofft weg :p

Eigentlich habe ich eine Funktion der man eine ID übergibt und die dann ein record zurück liefert, das Resultat ist jedoch das gleiche. Sinn der Sache ist, dass die Funktion pro Zeile nur einmal aufgerufen wird und nicht mehrfach.

Ausgang:

SELECT tbl_a.id, getData(tbl_a.id).col1, getData(tbl_a.id).col2 FROM tbla;

Ziel:

SELECT ta.id, (data).col1, (data).col2 FROM (SELECT tbl_a.id, getData(tbl_a.id) AS data FROM tbla) AS ta;

Das Problem ist dass es noch eine Menge mehr Funktionen wie getData(?) gibt und die alle auf OUT Parametern basieren also ein record liefern und keinen speziellen Datentyp.
Wenn es irgendwie ginge wäre es mir lieb das auch so beizubehalten, mit zusammengesetzten Typen funktionierts auf jeden Fall.

Also, ich hab mal a bissl damit gespielt und ich denke, Du solltest Dir dafür passende Typen definieren und die Records dahin casten. Also z.B.:

test=# create type my_type as (a int, b int, c int);
CREATE TYPE
test=*# select (row(2,3,4)::my_type).b;
 b
---
 3
(1 row)

Andreas