SQL объединить две таблицы на подмножествах данных - PullRequest
0 голосов
/ 02 марта 2020

У меня есть две таблицы в следующем формате:

ТАБЛИЦА 1

data_1      | data_2     |  weight  
 1          |   a        | 25   
 1          |   b        | 25 
 1          |   c        | 25 
 1          |   d        | 25 
 2          |   e        | 100

ТАБЛИЦА 2

data_4     | data_1     | data_2     | value
 AB        | 1          | a          | 25 
 AB        | 1          | b          | 25 
 AB        | 1          | c          | 25 
 AB        | 1          | d          | 25 
 BC        | 2          | e          | 50 
 BC        | 2          | f          | 50 
 CD        | 1          | a          | 50 
 CD        | 1          | b          | 50 

Я хочу создать следующий вывод:

OUTPUT

data_4     | data_1     | data_2    | value    | weight
 AB        | 1          | a         | 25       | 25 
 AB        | 1          | b         | 25       | 25
 AB        | 1          | c         | 25       | 25
 AB        | 1          | d         | 25       | 25
 BC        | 2          | e         | 50       | 100
 BC        | 2          | f         | 50       | 0
 CD        | 1          | a         | 50       | 25
 CD        | 1          | b         | 50       | 25
 CD        | 1          | c         | 0          | 25
 CD        | 1          | d         | 0          | 25

По сути, я хочу объединить таблицы data_1 и data_2 для каждой записи data_4, одновременно показывая значение и вес с соответствующими значениями.

Я попробовал пару вещей, но, похоже, не получил правильный вывод. Любая помощь приветствуется.

1 Ответ

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

Если я правильно понимаю, это довольно сложно. Сложная часть (на мой взгляд) - получить правильный data_4 в первом столбце - full join будет выдавать null значений.

Следующий подход берет все строки из table_2 и соответствует до table_1 с использованием left join. Затем в оставшиеся строки добавляется, что left join не включает:

select t2.data_4, t2.data_1, t2.data_2, t2.value, coalesce(t1.weight, 0) as weight
from table2 t2 left join
     table1 t1
     using (data_1, data_2)
union all
select t2.data_4, t1.data_1, t1.data_2, t2.value, t1.weight
from table_1 t1 cross join
     (select distinct t2.data_4 from table2 t2) d4 left join
     table_2 t2
     on t2.data_4 = d4.data_4 and
        t2.data_1 = t1.data_1 and 
        t2.data_2 = t1.data_2
where t2.data_4 is null;

РЕДАКТИРОВАТЬ:

Хммм. , , Я думаю, что может быть немного более простой подход:

select t41.data_4, t41.data_1, t2.data_2,
       coalesce(t2.value, 0) as value,
       coalesce(t1.weight, 0) as weight
from (select distinct t2.data_4, t2.data_1 from table_2 t2) d41 left join
     table_1 t1
     on t1.data_1 = t41.data_1 left join
     table_2 t2
     on t2.data_4 = t41.data_4 and
        t2.data_1 = t41.data_1 and
        (t2.data_2 = t1.data_2 or t1.data_1 is null);
...