Подтвердить что ты не робот

MySQL: FULL OUTER JOIN - Как объединить один столбец?

У меня есть вопрос, касающийся полного внешнего соединения в MySQL. У меня есть две (или более таблицы):

table1      table2
id  value   id  value2
1   a       1   b
2   c       3   d
3   e       4   f

Я использовал этот запрос, чтобы получить мое присоединение:

SELECT * 
FROM table1
LEFT OUTER JOIN table2
ON table1.'id'=table2.'id'
UNION
SELECT * 
FROM table1
RIGHT OUTER JOIN table2
ON table1.'id'=table2.'id'

получить:

id   value1  id   value2 
1    a       1    b
2    c       NULL NULL
3    e       3    d
NULL NULL    4    f

Моя проблема в том, что мне не удается одновременно свернуть два столбца идентификатора в один столбец, чтобы получить это:

id   value1  value2 
1    a       b
2    c       NULL
3    e       d
4    NULL    f

Любые предложения о том, как это сделать?

4b9b3361

Ответ 1

Использование:

    SELECT t1.id,
           t1.value,
           t2.value2 
      FROM table1 t1
 LEFT JOIN table2 t2 ON t2.id = t1.id
UNION
    SELECT t2.id,
           t1.value,
           t2.value2
      FROM TABLE1 t1
RIGHT JOIN TABLE2 t2 ON t2.id = t1.id

Оператор UNION удаляет дубликаты строк/записей, поэтому вам необходимо соответствующим образом определить/перечислить столбцы.

Сценарии:

DROP TABLE IF EXISTS `example`.`table1`;
CREATE TABLE  `example`.`table1` (
  `id` int(10) unsigned NOT NULL default '0',
  `value` varchar(45) NOT NULL default ''
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO table1 VALUES (1, 'a'), (2, 'c'), (3, 'e');

DROP TABLE IF EXISTS `example`.`table2`;
CREATE TABLE  `example`.`table2` (
  `id` int(10) unsigned NOT NULL default '0',
  `value2` varchar(45) NOT NULL default ''
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO table2 VALUES (1, 'b'), (3, 'd'), (4, 'f');

Изменить: Фиксированная строка выше

Ответ 2

SELECT 
COALESCE(t1.id, t2.id) as id,
t1.value1,
t2.value2
FROM table1 t1
FULL JOIN table2 t2 ON t1.id = t2.id;

Ответ 3

Для того, что я думаю, что вы пытаетесь сделать, я бы предложил вместо этого использовать FULL OUTER JOIN:

SELECT ISNULL(t1.id, t2.id) AS id, t1.value1, t2.value2
FROM table1 t1
FULL OUTER JOIN table2 t2 ON t1.id = t2.id