Com base no esquema Northwind :
Suponha que temos uma consulta como esta (desconsidere a utilidade real disso, pois o caso de uso real é mais envolvido)
SELECT unnest(r.agg) FROM (
SELECT array_agg(x) AS agg
FROM (
SELECT *
FROM northwind.u_suppliers s LEFT JOIN northwind.u_products p ON s.guid = p.supplier
) x
GROUP BY x.supplier
) r LIMIT 1;
o resultado é
(9Y_03ogA1mOixVtJTqB8zih9Lu5-DB-l--fYvnHhyMQ,22,"Dirk Luchte","Accounting Manager",6j7qZ3Pjad5irKAM1MKX1WU7hvkgIOhZoe9OeRfTX4Q,"(12345) 1210",,northwindSupplier,jp9VvzFBbklHelD_ybS1oDsJbILda1duNhMtCdGBZqg,0,do4_k8zCsOog5tYROlsouF81Uj9I5LbTFawvuPw9Q-0,"2017-10-11 08:45:14.982",47,"Zaanse koeken",9Y_03ogA1mOixVtJTqB8zih9Lu5-DB-l--fYvnHhyMQ,AkOUoKYOpHFWIkNcoPX3CLtTl4n_ACN6TwWxqd3gzYQ,"10 - 4 oz boxes",9.5,36,0,0,f,,northwindProduct)
que é um recorde.
Qual seria a maneira de criar uma tabela a partir disso com todas as colunas e registros não aninhados como linhas?
Então haveria:
u_suppliers_column1 | ... | u_suppliers.columnN | u_products.column1 | ... | u_products.columnN
------------------------------------------------------------------------------------------------
9Y_03og... | 22 | "Dirk Luchte" ...
O trecho é apenas para fins ilustrativos - é claro, criar agregado apenas para desagrupá-lo novamente não é sensato nessas circunstâncias, mas por questão de simplicidade e reprodutibilidade, decidi escrevê-lo como tal.
Graças a @ypercubeᵀᴹ , pode-se fazer isso criando primeiro um tipo intermediário com todas as colunas necessárias (de ambas as tabelas, já que é uma junção), como:
A seguinte consulta pode ser escrita como:
Se não houvesse registro anônimo (vindo de join), não precisaríamos do tipo intermediário.
Tanto quanto sei, não há como fazer isso sem preparar manualmente esse tipo antecipadamente.