次のように私は、クエリを持っている: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列によってグループ化することにしたい
id | _rowId | name
1 |1 | A
2 |1 | B
3 |2 | C
2 |2 | B
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
これは、正しい結果が得られます:「いくつかの試行錯誤の後、このSQLを生成しまし
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だけがそれを必要とします。 –