当多行满足要求时,如何在PostgreSQL中选择加入?

时间:2017-07-05 20:31:38

标签: sql postgresql group-by

当有多个值要加入时,如何在进行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中的某行相关联。

有更好的方法吗?

1 个答案:

答案 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' );