Присоединиться к запросу, но устранить дубликаты - PullRequest
0 голосов
/ 01 апреля 2020

Итак, у меня есть эти данные из tbl_left:

id   name   type    our_assets
1   'Mira'   cc        10
2   'Mira'   bb        9

И вот эти из tbl_right:

id   name   assets_other  name_of_assets
1   'Mira'      3            assets_a
2   'Mira'      1            assets_b
3   'Mira'      1            assets_c
4   'Mira'      1            assets_d

Как я могу объединить обе таблицы и получить что-то вроде этого:

 name   type    our_assets   assets_other  name_of_assets
'Mira'   cc        10            3            assets_a
'Mira'   bb        9             1            assets_b
'Mira'                           1            assets_c
'Mira'                           1            assets_d

Мне все равно, если тип столбца и our_assets имеют повторяющиеся значения, я пытался использовать соединение, но в результате получается 8 строк вместо 4, как:

 name   type    our_assets   assets_other  name_of_assets
'Mira'   cc        10            3            assets_a
'Mira'   cc        10            3            assets_a
'Mira'   bb        9             1            assets_b
'Mira'   bb        9             1            assets_b
'Mira'                           1            assets_c
'Mira'                           1            assets_c
'Mira'                           1            assets_d
'Mira'                           1            assets_d

Если я использую group by name_of_assets, тип столбца вернет только значение "cc".

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Вам нужно добавить другой критерий соединения, чем 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
0 голосов
/ 01 апреля 2020

Я думаю, что вы хотите left join на id и name:

select r.*, l.type, l.our_assets
from tbl_right r left join
     tbl_left l
     on l.id = r.id and l.name = r.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...