Если я правильно понимаю, это довольно сложно. Сложная часть (на мой взгляд) - получить правильный 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);