2017-10-17 2 views
1

Ich versuche zu verstehen, warum dies funktioniert:Nest eine select-Anweisung innerhalb array_to_json (array_agg (row_to_json())) in PostgreSQL

select 
    array_to_json(array_agg(row_to_json(positions_table))) 
from (
    select 
     sum(start_month), 
     function_id, 
     profile_id 
    from positions as subquery 
    group by function_id, profile_id 
) as positions_table 

Aber dies nicht:

select 
    profiles.id, 
    (array_to_json(array_agg(row_to_json(
     select 
      sum(start_month), 
      function_id, 
      profile_id 
     from positions as subquery 
     group by function_id, profile_id 
    )))) 
from profiles 

Es scheint, wie ich bin nicht erlaubt, die select... Anweisung innerhalb array_to_json(array_agg(row_to_json())) setzen und dass es stattdessen eine Tabelle verweisen muss.

Aber ich bin verdächtig, ich könnte etwas verpassen.

Der Fehler ist syntax error near select.

+0

FYI: anstatt 3 Datenkonvertierungen (JSON, Array, JSON) zu machen, sollten Sie 'jsonb_agg()' stattdessen für Ihr Wunschergebnis verwenden [mehr] (https://www.postgresql.org/docs/9.6/ static/functions-aggregate.html). Außerdem erwartet 'row_to_json'' record' als Eingabe, Unterabfrage ist kein Datensatz, der aus Datensätzen besteht. Sie können also keine Funktion erwarten, deren Zweck es ist, 1 einzelne Zeile in json umzuwandeln, um N Zeilen zu konvertieren. –

Antwort

1

Sie könnten Ihren Syntaxfehler beheben, indem Sie Ihre Unterauswahl in Klammern einschließen, aber dann sehen Sie Ihren zweiten Fehler; Postgres würde berichten:

Unterabfrage nur eine Spalte zurückgeben muss

Wenn Sie feste dass Fehler würden Sie sehen:

Spalte "profiles.id" muss in die erscheinen GROUP BY-Klausel oder in einer Aggregatfunktion

... verwendet werden, die näher an th. Kommt e echte Ursache für dein Problem. Hinzufügen GROUP BY id erhalten Postgres die Ursache zu berichten:

mehr als eine Zeile zurück von einer Unterabfrage als Ausdruck verwendet

Die Funktion row_to_json erwartet eine einzelne Zeile.

Um Ihre JSON-Zusammenfassungen nach Profil-ID zu aggregieren, müssen Sie einen Join durchführen.

SELECT 
    pr.id, 
    array_to_json(array_agg(row_to_json(positions_table.*))) 
FROM profiles pr JOIN (
    SELECT sum(start_month), function_id, profile_id 
    FROM positions 
    GROUP BY function_id, profile_id 
) positions_table ON positions_table.profile_id = pr.id 
GROUP BY pr.id 

(Sie können die .* von positions_table.*, lasse ich es nur für Klarheit hinzugefügt).

Verwandte Themen