sql 从两个具有不同行数的表中按状态返回 json 对象

问题描述 投票:0回答:2

我正在使用 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}

sql postgresql join pivot inner-join
2个回答
1
投票

使用 PostgreSQL

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

在这里尝试一下:https://onecompiler.com/postgresql/3yfyffrrg

感谢:https://stackoverflow.com/a/6558226/2743458


1
投票

使用

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”:正确}}]
© www.soinside.com 2019 - 2024. All rights reserved.