我在努力限制array_agg()
返回的结果数量。这是我到目前为止的查询:
SELECT s.*,
(
SELECT array_agg(row_to_json(smr.*))
AS "monthRatings"
)
FROM services s
INNER JOIN servicemonthratings smr ON s._id = smr.service_id
GROUP BY s._id
是否有更好的方法可以完成与上述相同的事情?
答案 0 :(得分:0)
这没有任何意义,你显然很困惑。
ARRAY()
提供一些样本数据和您想要的输出。
答案 1 :(得分:0)
简单:
SELECT s.*, array_agg(row_to_json(smr)) AS "monthRatings"
FROM services s
JOIN servicemonthratings smr ON s._id = smr.service_id
GROUP BY s._id;
smr
(表示行类型)而不是smr.*
,此处的结果相同。services ._id
必须是PK,否则查询是无意义的。我怀疑你真的想要一个JSON数组行,你不想要消除没有评级的服务(
)SELECT s.*, smr."monthRatings"
FROM services s, LATERAL (
SELECT json_agg(smr) AS "monthRatings"
FROM servicemonthratings
WHERE service_id = s._id
) smr;
现在您不需要汇总services
,_id
也不一定是PK。
由于LATERAL
子查询总是返回一行(由于其中包含聚合函数),因此不会消除任何服务。