当有多个值要加入时,如何在进行INNER JOIN时选择在一个单元格中获取JSON数组?
ex Tables:
T1:
id | name
1 Tom
2 Dom
T2:
user_id | product
1 Milk
2 Cookies
2 Banana
当然我做SELECT * FROM T1 INNER JOIN T2 ON T1.id = T2.user_id
。
但后来我得到了:
id | Name | product
1 Tom Milk
2 Dom Cookies
2 Dom Banana
但我想得到:
id | Name | product
1 Tom [{"product":"Milk}]
2 Dom [{"product":"Cookies"}, {"product":"Banana"}]
如果我对agg
函数执行某些操作,那么我需要将其他所有内容放在GROUP BY
中,其中我至少有10个参数。整个查询需要5分钟以上。
我的T1
约为4000行,T2
约为300 000行,每行都与T1
中的某行相关联。
有更好的方法吗?
答案 0 :(得分:0)
使用LATERAL,您可以按照以下示例解决此问题:
-- The query
SELECT *
FROM table1 t1,
LATERAL ( SELECT jsonb_agg(
jsonb_build_object( 'product', product )
)
FROM table2
WHERE user_id = t1.id
) t2( product );
-- Result
id | name | product
----+------+-------------------------------------------------
1 | Tom | [{"product": "Milk"}]
2 | Dom | [{"product": "Cookies"}, {"product": "Banana"}]
(2 rows)
-- Test data
CREATE TABLE IF NOT EXISTS table1 (
id int,
"name" text
);
INSERT INTO table1
VALUES ( 1, 'Tom' ),
( 2, 'Dom' );
CREATE TABLE IF NOT EXISTS table2 (
user_id int,
product text
);
INSERT INTO table2
VALUES ( 1, 'Milk' ),
( 2, 'Cookies' ),
( 2, 'Banana' );