Ошибка повторяющегося столбца в UNION двух таблиц с JOINS mysql - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть две таблицы, как показано ниже:

CREATE TABLE NameWithAddress
  ( 
    Name                    VARCHAR(255),
    Address                 VARCHAR(255)
  ); 

  CREATE TABLE NamesWithCountry
  ( 
    Name                   VARCHAR(255),
    Country                VARCHAR(255)
  );

Я хочу объединить обе таблицы, чтобы соответствующие строки в имени были объединены, но в запрос все еще включены несопоставленные строки из обеих таблиц

У меня есть запрос, который возвращает результаты, которые я хочу:

SELECT *
FROM `NameWithAddress`
LEFT OUTER JOIN `NamesWithCountry` ON `NameWithAddress`.`Name` = `NamesWithCountry`.`Name`
UNION SELECT *
FROM `NameWithAddress`
RIGHT OUTER JOIN `NamesWithCountry` ON `NameWithAddress`.`Name` = `NamesWithCountry`.`Name`
WHERE `NameWithAddress`.`Name` IS NULL

Но когда я пытаюсь выбрать результат этого запроса, я получаю ошибку столбца-дубликата.Вот как я выполняю SELECT:

SELECT T.* FROM (
SELECT *
FROM `NameWithAddress`
LEFT OUTER JOIN `NamesWithCountry` ON `NameWithAddress`.`Name` = `NamesWithCountry`.`Name`
UNION SELECT *
FROM `NameWithAddress`
RIGHT OUTER JOIN `NamesWithCountry` ON `NameWithAddress`.`Name` = `NamesWithCountry`.`Name`
WHERE `NameWithAddress`.`Name` IS NULL) T

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Обычно вы делаете это с 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 могут быть трудно выяснить (и исправить).

0 голосов
/ 23 ноября 2018

Вам необходимо переименовать один из столбцов Name или пропустить их:

SELECT T.* FROM (
SELECT `NameWithAddress`.*, `NamesWithCountry`.`Country`
FROM `NameWithAddress`
LEFT OUTER JOIN `NamesWithCountry` ON `NameWithAddress`.`Name` = `NamesWithCountry`.`Name`
UNION SELECT `NameWithAddress`.*, `NamesWithCountry`.`Country`
FROM `NameWithAddress`
RIGHT OUTER JOIN `NamesWithCountry` ON `NameWithAddress`.`Name` = `NamesWithCountry`.`Name`
WHERE `NameWithAddress`.`Name` IS NULL) T
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...