当多行满足要求时,如何在PostgreSQL中使用join进行选择?

当多行满足要求时,如何在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 [

当有超过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     [{"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' );