2017-07-05 15 views
0

如何進行選擇以在一個單元格中獲取JSON數組時進行INNER JOIN加入時有多個值?如何在多個行滿足需求時通過聯接在PostgreSQL中進行選擇?

前表:

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約300000行,每個行與T1中的某一行相關。

有沒有更好的方法?

+0

'ARRAY_AGG()'? https://www.postgresql.org/docs/current/static/functions-aggregate.html – Nicarus

回答

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'); 
+0

這工作順利。謝謝! – hitchnsmile

相關問題