2017-07-05 2 views
0

Wie wird eine Auswahl getroffen, um ein JSON-Array in einer Zelle zu erhalten, wenn INNER JOIN ausgeführt wird, wenn mehr als 1 Werte hinzugefügt werden sollen?Wie erfolgt die Auswahl in PostgreSQL mit Join, wenn mehr als eine Zeile die Anforderungen erfüllt?

ex Tables:

T1:

id | name 
1 Tom 
2 Dom 

T2:

user_id | product 
1   Milk 
2   Cookies 
2   Banana 

ich natürlich SELECT * FROM T1 INNER JOIN T2 ON T1.id = T2.user_id. Aber dann bekomme ich:

id | Name | product 
1 Tom  Milk 
2 Dom  Cookies 
2 Dom  Banana 

Aber ich möchte bekommen:

id | Name | product 
1 Tom  [{"product":"Milk}] 
2 Dom  [{"product":"Cookies"}, {"product":"Banana"}] 

Wenn ich etwas mit agg Funktionen tun, dann brauche ich alles andere in GROUP BY zu setzen, wo ich mindestens 10 haben Argumente. Und die gesamte Abfrage dauert mehr als 5 Minuten.

Meine T1 ist um 4000 Zeilen und T2 um 300 000 Zeilen, die jeweils mit einer Zeile in T1 verbunden sind.

Gibt es einen besseren Weg?

+0

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

Antwort

0

LATERAL Verwenden Sie können es als gegeben Beispiel unten lösen:

-- 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

Dies funktioniert reibungslos. Vielen Dank! – hitchnsmile

Verwandte Themen