Dadas duas tabelas com uma contagem de linhas indefinidas com um nome e um valor, como eu exibiria CROSS JOIN
uma função dinâmica sobre seus valores.
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);
Por exemplo, se essa função fosse multiplicação, como eu geraria uma tabela (multiplicação) como a abaixo,
Todas essas (arg1,arg2,result)
linhas podem ser geradas com
SELECT foo.name AS arg1, bar.name AS arg2, foo.x*bar.x AS result
FROM foo
CROSS JOIN bar;
Portanto, isso é apenas uma questão de apresentação. Gostaria que ele também trabalhasse com um nome personalizado - um nome que não é apenas o argumento CAST
editado no texto, mas definido na tabela,
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);
Eu acho que isso seria facilmente possível com um CROSSTAB capaz de um tipo de retorno dinâmico.
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**
Mas, sem o **MAGIC**
, eu recebo
ERROR: a column definition list is required for functions returning "record" LINE 1: SELECT * FROM crosstab(
Para referência, usando os exemplos acima com nomes isso é algo mais parecido com o que tablefunc
's crosstab()
necessidades.
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);
Mas agora voltamos a fazer suposições sobre o conteúdo e o tamanho da bar
tabela em nosso exemplo. Então se,
- As tabelas são de comprimento indefinido,
- Em seguida, a junção cruzada representa um cubo de dimensão indefinida (por causa do acima),
- Os nomes de categorias (linguagem de tabulação cruzada) estão na tabela
Qual é o melhor que podemos fazer no PostgreSQL sem uma "lista de definições de colunas" para gerar esse tipo de apresentação?