MySQL: FULL OUTER JOIN - How do I merge one column

2019-01-17 04:22发布

Dear Everyone,
First of all, I would like to thank the people that answer questions on this page for the great work you are doing here. I am not very experienced in programming and this page has been a tremendous help for me.

Now coming to my specific question regarding a FULL OUTER JOIN in MySQL. I have two (or more table):

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

I have used this query to get my join:

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`

to get:

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

My problem is that I don't manage to simultaneously collapse the two id columns into one column to get this:

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

Any suggestions on how to do it?

3条回答
虎瘦雄心在
2楼-- · 2019-01-17 04:43
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楼-- · 2019-01-17 04:51

Use:

    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

The UNION operator removes row/record duplicates, so you have to define/list the columns appropriately.

Scripts:

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');

Edit: Fixed line above

查看更多
相关推荐>>
4楼-- · 2019-01-17 04:52

For what I think you are trying to do, I would suggest using a FULL OUTER JOIN instead:

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
查看更多
登录 后发表回答