亲爱的每个人,
首先,我要感谢在这个页面回答问题的人们,感谢你们在这里所做的出色工作。我在编程方面不是很有经验,这页对我来说是一个巨大的帮助。
现在回答我关于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列折叠为一列来实现此目的:
id value1 value2 1 a b 2 c NULL 3 e d 4 NULL f
有关如何操作的任何建议吗?
答案 0 :(得分:33)
SELECT
COALESCE(t1.id, t2.id) as id,
t1.value1,
t2.value2
FROM table1 t1
FULL JOIN table2 t2 ON t1.id = t2.id;
答案 1 :(得分:11)
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 :(得分:-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