我正在使用 PostgreSQL 9.5
我有两张桌子:
A
ID | isStatusA | IsStatusB | IsStatusC
0 | true | false | true
表格只有 1 行用于我需要的数据。我还有 B 桌:
ID | status | a_id
0 | A | 0
0 | C | 0
当我用“from A inside join B on a.id = b.a_id”编写选择时,我得到了 2 行。我必须只获取一行(或 json 对象)并检查表 A 中的 true/false 以及表 B 中的状态是否存在。要返回 true,我必须检查这两个条件。
预期输出:
{A: true, B: false, C:true}
ARRAY_AGG()
函数以及 GROUP BY
来“非规范化”B
表 status
列。然后是 INNER JOIN
表 A
以及一个临时表,此处名为 B_agg
。
SELECT A.*, B_agg.status_agg
FROM A
INNER JOIN (
SELECT a_id, ARRAY_AGG(status) status_agg FROM B GROUP BY a_id
) B_agg ON A.ID = B_agg.a_id
;
输出:
id | 状态 | 状态b | 状态c | status_agg |
---|---|---|---|---|
0 | t | t | f | {A,C} |
临时表查询:
SELECT a_id, ARRAY_AGG(status) status_agg FROM B GROUP BY a_id
...输出:
a_id | status_agg |
---|---|
0 | {A,C} |
然后将结果与表 INNER JOIN
连接列
A
和 A.ID
进行 B_agg.a_id
编辑:ON A.ID = B_agg.a_id
。
临时表被赋予别名
B_agg
,用于临时表查询之外的访问,如:B_agg.status_agg
。
JSON_AGG()
和 JSON_BUILD_OBJECT()
创建 JSON 对象并分配所需的对象键名称:
SELECT JSON_AGG(
JSON_BUILD_OBJECT('A',isStatusA,'B',isStatusB,'C',isStatusB)
) status_agg
FROM A
;
输出:
status_agg |
---|
[{“A”:正确,“B”:正确,“C”:正确}] |
在这里尝试一下:https://onecompiler.com/postgresql/3yfyjt24r
A
表提供了生成输出{A: true, B: false, C:true}
所需的所有信息。
还可以包含
ID
列,以防在单个查询中收集多个 ID:
SELECT JSON_AGG(
JSON_BUILD_OBJECT(ID,
JSON_BUILD_OBJECT('A',isStatusA,'B',isStatusB,'C',isStatusB)
)
) status_agg
FROM A
;
输出:
status_agg |
---|
[{“0”:{“A”:正确,“B”:正确,“C”:正确}}] |