基于Northwind架构:
假设我们有这样的查询(请忽略它的实际用处,因为涉及到更多实际用例)
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;
结果是
(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)
这是一个记录。
从中创建一个包含所有列和未嵌套记录作为行的表的方法是什么?
所以会有:
u_suppliers_column1 | ... | u_suppliers.columnN | u_products.column1 | ... | u_products.columnN
------------------------------------------------------------------------------------------------
9Y_03og... | 22 | "Dirk Luchte" ...
该片段仅用于说明目的——当然,在这种情况下,创建聚合只是为了再次取消嵌套是不明智的,但为了简单和可重现性,我决定这样写。
感谢@ypercubeᵀᴹ,可以通过首先创建具有所有必需列(来自两个表,因为它是连接)的中间类型来解决它,例如:
然后可以编写以下查询,例如:
如果没有匿名记录(来自 join),我们就不需要中间类型。
据我所知,如果不预先手动准备此类类型,就无法做到这一点。