Wie würde ich bei zwei Tabellen mit einer undefinierten Zeilenanzahl mit einem Namen und einem Wert eine Pivot- CROSS JOIN
Funktion über ihren Werten anzeigen?
CREATE TEMP TABLE foo AS
SELECT x::text AS name, x::int
FROM generate_series(1,10) AS t(x);
CREATE TEMP TABLE bar AS
SELECT x::text AS name, x::int
FROM generate_series(1,5) AS t(x);
Wenn diese Funktion beispielsweise Multiplikation wäre, wie würde ich eine (Multiplikations-) Tabelle wie die folgende erzeugen?
Alle diese (arg1,arg2,result)
Zeilen können mit erzeugt werden
SELECT foo.name AS arg1, bar.name AS arg2, foo.x*bar.x AS result
FROM foo
CROSS JOIN bar;
Dies ist also nur eine Frage der Präsentation. Ich möchte, dass dies auch mit einem benutzerdefinierten Namen funktioniert - einem Namen, der nicht nur als Textargument dient CAST
, sondern in der Tabelle festgelegt ist.
CREATE TEMP TABLE foo AS
SELECT chr(x+64) AS name, x::int
FROM generate_series(1,10) AS t(x);
CREATE TEMP TABLE bar AS
SELECT chr(x+72) AS name, x::int
FROM generate_series(1,5) AS t(x);
Ich denke, dass dies mit einem CROSSTAB, der einen dynamischen Rückgabetyp aufweist, leicht möglich wäre.
SELECT * FROM crosstab(
'
SELECT foo.x AS arg1, bar.x AS arg2, foo.x*bar.x
FROM foo
CROSS JOIN bar
', 'SELECT DISTINCT name FROM bar'
) AS **MAGIC**
Aber ohne das **MAGIC**
bekomme ich
ERROR: a column definition list is required for functions returning "record" LINE 1: SELECT * FROM crosstab(
Als Referenz der obigen Beispiele mit Namen verwenden , ist dies etwas mehr wie das, was tablefunc
‚s crosstab()
will.
SELECT * FROM crosstab(
'
SELECT foo.x AS arg1, bar.x AS arg2, foo.x*bar.x
FROM foo
CROSS JOIN bar
'
) AS t(row int, i int, j int, k int, l int, m int);
Aber jetzt kehren wir zu den Annahmen über den Inhalt und die Größe der bar
Tabelle in unserem Beispiel zurück. Also wenn,
- Die Tabellen sind undefiniert lang,
- Dann repräsentiert der Cross-Join einen Würfel mit undefinierter Dimension (wegen oben),
- Die Kategorienamen (Kreuzworträtsel) sind in der Tabelle aufgeführt
Was ist das Beste, was wir in PostgreSQL ohne eine "Spaltendefinitionsliste" tun können, um eine solche Präsentation zu erstellen?