Используйте collect_set
, чтобы получить массив частей на (name, function
), затем используйте concat_ws
, чтобы объединить массив с использованием запятой в качестве разделителя:
select t.name1, t1.function, t2.parts, t2.body, t1.scope
from
(select name1, function,
concat_ws(',',collect_set(scope)) as scope
from table1
group by name1, function
) t1
inner join
(select name2, function,
concat_ws(',',collect_set(parts)) as parts,
concat_ws(',',collect_set(Body)) as Body
from table2 t2
group by name2, function
)t2
on t1.name1=t2.name2 and t1.function=t2.function
Еще один подход - без объединения, используя UNION ALL + агрегация, это может быть более производительным:
select name, function,
concat_ws(',',collect_set(parts)) as parts,
concat_ws(',',collect_set(Body)) as Body,
concat_ws(',',collect_set(scope)) as scope
from
(
select name1 as name, function, null as parts, null as Body, scope from table1
UNION ALL
select name2 as name, function, parts, Body, null as scope from table2
)s
group by name, function