Как выбрать данные таблицы A в одной записи с дополнительными столбцами из таблицы B, заполненными данными из таблицы C - PullRequest
0 голосов
/ 31 марта 2020

У меня есть таблица A, которая имеет отношение "OneToMany" к таблице C. Таблица B также связана с таблицей C. Я хочу получить все данные из таблицы A, объединенные со всеми идентификаторами таблицы B в качестве имени столбца (1-3 в этом примере), заполненного правильными данными таблицы B из таблицы C из столбца «значение».

Это самый простой сценарий, который я могу себе представить, где (x, y, z, j, k, l, m) может быть чем угодно, а где (a, b, c) - просто имена столбцов таблицы A

Table A:
ID - a - b - c 
--------------
1  - x - y - z    
2  - x - y - z
3  - x - y - z

Table B:
ID
--
1
2
3

Table C:
ID - Table A (FK) - Table B (FK) - value 
------------------------------------------
1  - 1            - 1              - j
2  - 1            - 2              - k  
3  - 1            - 3              - l
4  - 2            - 1              - m


Expected result
ID - a - b - c    - B1   - B2   - B3     (B1 means Table B with id 1 which should be column name)
-------------------------------------
1  - x - y - z    - j    - k    - l        ("j" for example is Value from Table C where Table A is 1 and Table B is 1 as well)
2  - x - y - z    - m    - NULL - NULL
3  - x - y - z    - NULL - NULL - NULL

Запрос моей мечты:

select A.*, GET_ALL_IDS_AS_COLUMN_NAME_FROM_TABLE(B) from A SOMEHOW FILL DOES COLUMNS FROM B BY C BY THIS <MAGIC> CONDITION WHERE C.A = A

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Я думаю, вам просто нужны left join и агрегация:

select a.*, c.b_1, c.b_2, c.b_3
from a left join
     (select c.id_a,
             max(case when b_id = 1 then value end) as b_1,
             max(case when b_id = 2 then value end) as b_2,
             max(case when b_id = 3 then value end) as b_3
      from c
      group by c.id_a
     ) c
     on c.id_a = a.id;

Но, если вы хотите это dynamici c, тогда вам нужно будет использовать Dynami c SQL для построения стержня.

0 голосов
/ 31 марта 2020

Вы можете использовать условное агрегирование:

select 
    a.id,
    a.a,
    a.b,
    a.c,
    max(case when b.id = 1 then c.value end) b1,
    max(case when b.id = 2 then c.value end) b1,
    max(case when b.id = 3 then c.value end) b1,
from a
cross join b
left join c on c.id_a = a.id and c.id_b = b.id
group by 
    a.id,
    a.a,
    a.b,
    a.c

Обратите внимание, что было бы проще объединить все значения из таблицы C вместо распределения их по нескольким столбцам:

select 
    a.*,
    (
        select group_concat(c.value order by b.id delimiter '-' )
        from b
        inner join c on c.id_a = a.id and c.id_b = b.id
    ) b_values
from a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...