Ich habe eine Abfrage wie folgt:GROUP BY und array_agg in Postgres
WITH "data" ("displayName","habitas","_rowId") AS (VALUES
('Moo','[{"id":"1", "name": "A"},{"id":"2", "name": "B"}]'::json,1)
,('Boo','[{"id":"3", "name": "C"},{"id":"2", "name": "B"}]'::json,2))
SELECT
t.id, "data"."_rowId", t.name
FROM "data"
CROSS JOIN
json_to_recordset("data"."habitas") as t("id" text, "name" text)
und es gibt Ergebnisse als:
id | _rowId | name
1 |1 | A
2 |1 | B
3 |2 | C
2 |2 | B
Ich möchte eigentlich die Ergebnisse durch die id-Spalte gruppiert werden, damit ich habe diese SQL nach einiger Versuch und Fehler erzeugt hat:
WITH "data" ("displayName","habitas","_rowId") AS (VALUES
('Moo','[{"id":"1", "name": "A"},{"id":"2", "name": "B"}]'::json,1)
,('Boo','[{"id":"3", "name": "C"},{"id":"2", "name": "B"}]'::json,2))
SELECT
t.id, array_agg("data"."_rowId"), t.name
FROM "data"
CROSS JOIN
json_to_recordset("data"."habitas") as t("id" text, "name" text)
GROUP BY t.id, t.name
und dies erzeugt dann die richtigen Ergebnisse:
Es ist ziemlich ok und scheint zu arbeiten, aber ich frage mich, ob ich irgendwelche Tricks verpasst habe, um diese Abfrage besser zu konstruieren?
Sie haben es in einer natürlichen, richtigen Weise getan. 'LEFT JOIN ... ON TRUE' sieht etwas komisch aus, nur' CROSS JOIN' ist lesbarer. – klin
Danke @klin - mir gefällt auch die Lesbarkeit von CROSS JOIN besser so habe meine Suchanfrage entsprechend angepasst. – Jarym
Zitierte Bezeichner sind schwer zu lesen und können Probleme verursachen. Verwenden Sie es nur, wenn die Bezeichner ungültige Zeichen enthalten. Grundsätzlich werden nur ORMs benötigt. –