当多行满足要求时,如何在PostgreSQL中使用join进行选择?
当有超过1个值要连接时,在进行内部连接时,如何在一个单元格中进行选择以获取JSON数组 表外: T1: T2: 当然,我会当多行满足要求时,如何在PostgreSQL中使用join进行选择?,sql,postgresql,group-by,Sql,Postgresql,Group By,当有超过1个值要连接时,在进行内部连接时,如何在一个单元格中进行选择以获取JSON数组 表外: T1: T2: 当然,我会在T1.id=T2.user\u id上从T1内部连接T2选择*。 但我得到: id | Name | product 1 Tom Milk 2 Dom Cookies 2 Dom Banana 但我想得到: id | Name | product 1 Tom [{"product":"Milk}] 2 Dom [
在T1.id=T2.user\u id
上从T1内部连接T2选择*。
但我得到:
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
函数执行某些操作,那么我需要将所有其他内容放入groupby
中,其中至少有10个参数。整个查询需要5分钟以上的时间
我的T1
大约有4000行,T2
大约有300000行,每个行都与T1
中的一些行关联
有更好的方法吗?使用以下示例,您可以解决此问题:
-- 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' );
数组_agg()
?
id | Name | product
1 Tom [{"product":"Milk}]
2 Dom [{"product":"Cookies"}, {"product":"Banana"}]
-- 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' );