Вам нужно добавить другой критерий соединения, чем name
, чтобы избежать дублирования записей. Один из вариантов использует row_number()
(доступно в MySQL 8.0):
select r.name, l.type, l.our_assets, r.assets_other, r.name_of_asset
from (select r.*, row_number() over(partition by name order by id) rn from tbl_right) l
left join (select l.*, row_number() over(partition by name order by id) rn from tbl_left) r
on r.name = l.name and r.rn = l.rn
Если записи могут отсутствовать на обоих концах объединения, вы можете использовать union all
и агрегацию вместо:
select
name,
max(type) type,
amx(our_assets) our_assets,
max(assets_other) assets_other,
max(name_of_asset) name_of_asset
from (
select
name,
type,
our_assets,
null assets_other,
null name_of_asset,
row_number() over(partition by name order by id) rn
from tbl_left
union all
select
name,
null,
null,
assets_other,
name_of_asset,
row_number() over(partition by name order by id) rn
from tbl_right
) t
group by name, rn