Einfachere:
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;
- Keine Notwendigkeit für eine subselect.
- Sie können einfach den Tabellenalias
smr
(dh den Zeilentyp) anstelle von smr.*
verwenden, das gleiche Ergebnis hier.
services ._id
muss die PK sein, oder die Abfrage ist Unsinn.
Ich vermute, dass Sie wirklich ein JSON-Array von Zeilen wollen, und Sie wollen nicht, Dienste zu beseitigen, die bislang keine haben (noch):
SELECT s.*, smr."monthRatings"
FROM services s, LATERAL (
SELECT json_agg(smr) AS "monthRatings"
FROM servicemonthratings
WHERE service_id = s._id
) smr;
Sie brauchen jetzt nicht services
aggregieren und _id
muss nicht der PK sein.
Und seit die LATERAL
Unterabfrage immer gibt eine Zeile (aufgrund der Aggregatfunktion in es) keine Dienste beseitigt werden.
Bearbeiten Sie Ihre Frage und geben Sie Beispieldaten und gewünschte Ergebnisse an. Deine Frage ist nicht klar. –
Wollen Sie wirklich ein Postgres-Array von JSON-Werten? Kein JSON-Array? Und willst du wirklich eine 'INNER JOIN' Lösung, die (noch) keine Bewertungen hat? –