2017-05-10 5 views
0

Ich habe Probleme mit der Begrenzung der Anzahl der Ergebnisse von array_agg() zurückgegeben. Dies ist meine Abfrage so weit:Limit Anzahl der Ergebnisse von 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 

Gibt es vielleicht einen besseren Weg, um das gleiche wie oben zu erreichen?

+0

Bearbeiten Sie Ihre Frage und geben Sie Beispieldaten und gewünschte Ergebnisse an. Deine Frage ist nicht klar. –

+0

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? –

Antwort

0

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.

0

Das macht keinen Sinn Sie sind eindeutig verwirrt.

  1. Sie verwenden array_agg nicht, um json zu aggregieren. Sie verwenden json_agg.
  2. Wenn du gehst array_agg() so verwenden, können Sie auch den Array-Konstruktor verwenden ARRAY()
  3. Wenn Sie array_agg verwenden werden, sollten Sie es in die äußere rollen und es aus der get Anordnungsliste.

Legen Sie einige Beispieldaten und Ihre gewünschte Ausgabe.