30

我有一个关于 MySQL 中的 FULL OUTER JOIN 的问题。我有两个(或更多表):

表 1 表 2
id 值 id 值2
1个1个
2 天 3 天
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`

要得到:

标识值 1 标识值 2
1个1个
2 c 空空
3 天 3 天
NULL NULL 4 f

我的问题是我没有设法同时将两个 id 列折叠成一列来得到这个:

id 值1 值2
1个抗体
2 c 空
3 版
4 空 f

关于如何做的任何建议?

4

3 回答 3

62
SELECT 
COALESCE(t1.id, t2.id) as id,
t1.value1,
t2.value2
FROM table1 t1
FULL JOIN table2 t2 ON t1.id = t2.id;
于 2015-01-21T20:21:42.983 回答
13

采用:

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

编辑:上面的固定线

于 2010-12-11T04:05:41.913 回答
-1

对于我认为您正在尝试做的事情,我建议您使用 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
于 2010-12-11T04:25:32.543 回答