我正在尝试使用联接查询来构造单行结果,将联接表中的行包装到 json 数组中。
这是一个示例方案;
CREATE TABLE main(id int);
INSERT INTO main values(1);
create TABLE sub1(id int, main_id int, lang int);
insert into sub1 values (1, 1, 1);
insert into sub1 values (1, 1, 2);
create TABLE sub2(id int, main_id int, lang int);
insert into sub2 values(1, 1, 1);
Run Code Online (Sandbox Code Playgroud)
我的查询:
select main.id,
array_to_json(array_agg(sub1.lang)) as sub1,
array_to_json(array_agg(sub2.lang)) as sub2
from main
inner join sub1 on main.id = sub1.main_id
inner join sub2 on main.id = sub2.main_id
where main.id = 1
group by main.id
Run Code Online (Sandbox Code Playgroud)
此刻,这又回来了;
| id | sub1 | sub2 |
|----|-------|-------|
| 1 | [1,2] | [1,1] |
Run Code Online (Sandbox Code Playgroud)
我希望结果看起来像这样;(这只是从表中取出 lang)
| id | sub1 | sub2 |
|----|-------|------|
| 1 | [1,2] | [1] |
Run Code Online (Sandbox Code Playgroud)
我这里有一个 sql 小提琴:
http://sqlfiddle.com/#!17/60c3f/2
我研究过使用 UNION 查询,但它返回多行和重复数据。我希望我能够以与上面尝试过的类似的方式做到这一点,但我不确定如何/是否可能?
您可以使用distinct
array_agg 中的关键字来删除重复项:
array_to_json(array_agg(distinct sub2.lang))
Run Code Online (Sandbox Code Playgroud)
正如 @a_horse_with_no_name 所建议的,它可以简化为:
json_agg(distinct sub1.lang)
Run Code Online (Sandbox Code Playgroud)