Как выполнить операцию соединения с вложенными данными для Postgresql - PullRequest
0 голосов
/ 12 июля 2020

У меня есть несколько таблиц, над которыми я хочу выполнить операцию соединения. Они выглядят примерно так:

Основные данные

+----+-------+--------------+
| id | title | mainCategory |
+----+-------+--------------+
| 1  | xyz   | 1            |
+----+-------+--------------+
| 2  | zba   | 2            |
+----+-------+--------------+
| 3  | ync   | 3            |
+----+-------+--------------+

Подкатегории

+----+-------+--------------+
| ID | rowId | categoryID |
+----+-------+--------------+
| 7  | 1   | 1            |
+----+-------+--------------+
| 9  | 1   | 2            |
+----+-------+--------------+
| 10  | ync   | 3            |
+----+-------+--------------+
rowID is a foreign key that links a sub category to the main data

Таблица категорий

+----+-------+
| id | title |
+----+-------+
| 1  | apples   |             
+----+-------+
| 2  | Bananas   |
+----+-------+
| 3  | Tomatoes   |
+----+-------+

В идеале я бы хотел если возможно, получите данные в таком красивом порядке. Мне просто нужно иметь subCategoryID и значение категории.

+----+-------+--------------+ --------------+
| id | title | mainCategory | SubCategory
+----+-------+--------------+ --------------+
| 1  | xyz   | 1            | (7 , Apples ), (9 , Bananas) |
+----+-------+--------------+--------------+
| 2  | zba   | 2            | Null
+----+-------+--------------+--------------+
| 3  | ync   | 3            | (10, Tomatoes )
+----+-------+--------------+--------------+

Любые советы о том, как это сделать, были бы замечательными! Большое вам спасибо.

1 Ответ

0 голосов
/ 13 июля 2020

Один из вариантов - соединения и агрегирование строк. В Postgres для этого пригодится боковое соединение:

select m.*, x.*
from main m
cross join lateral (
    select string_agg('(' || sc.id || ', ' || c.title || ')', ', ') subcategory
    from sub_category sc
    inner join category c on c.id = sc.category_id
    where sc.rowId = m.main_category
) x
...