Обычно вы делаете это с full join
, но MySQL не поддерживает FULL JOIN
.Я бы порекомендовал:
SELECT n.name, nwa.address, nwc.country
FROM (SELECT Name
FROM NameWithAddress
UNION -- on purpose to remove duplicates
SELECT Name
FROM NamesWithCountry
) n LEFT JOIN
NameWithAddress nwa
ON nwa.name = n.name LEFT JOIN
NamesWithCountry nwc
ON nwc.name = n.name;
Если вы знаете, что имена никогда не дублируются ни в одной из таблиц, тогда:
select name, max(address) as address, max(country) as country
from ((select name, address, null as country
from namewithaddress
) union all
(select name, null as address, country
from namewithcountry
)
) n
group by name;
Я настоятельно не рекомендую использовать union
с left join
и right join
.Это своего рода приближение к full join
при некоторых обстоятельствах.Тем не менее, это более интенсивно по производительности, чем эти методы, и тонкие отличия от реального full join
могут быть трудно выяснить (и исправить).