1
ARRAY_AGG我有一個查詢,如下所示:GROUP BY和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)
,並返回結果爲:
id | _rowId | name
1 |1 | A
2 |1 | B
3 |2 | C
2 |2 | B
其實我想要的結果由ID列進行分組,所以我「VE產生了一些試驗和錯誤之後此SQL:
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
並且這然後產生正確的結果:
id | _rowId | name
1 |{1} | A
2 |{2} | C
3 |{1,2} | B
這相當好看,似乎工作,但我想知道如果我錯過了任何技巧,以更好的方式構建此查詢?
你已經以自然,正確的方式完成了。 'LEFT JOIN ... ON TRUE'看起來有點奇怪,只是'CROSS JOIN'更具可讀性。 – klin
感謝@klin - 我也很喜歡CROSS JOIN的可讀性,所以相應地調整了我的查詢。 – Jarym
引用的標識符很難閱讀,可能會給您帶來問題。只有在標識符中存在非法字符時才使用它。基本上只有ORM需要它。 –