我正在加入2个表-tbl1和tbl2。左连接提供来自tbl1的所有数据,该数据在tbl2中或仅在tbl1上。右连接提供来自tbl2的数据,这在tbl1中是不存在的。
我想结合两种结果。
这样做的最佳方法是什么,以便从tbl1和tbl2获取所有数据?
答案 0 :(得分:13)
唯一可以做到的就是使用UNION
。 MySQL不像MSSQL那样支持FULL JOIN
。
SELECT *
FROM tbl1 t1
LEFT JOIN tbl2 t2
ON t1.col = t2.col
UNION
SELECT *
FROM tbl1 t1
RIGHT JOIN tbl2 t2
ON t1.col>= t2.<col
<强> SEE HERE: Simulating FULL JOIN in MYSQL 强>
顺便说一下,UNION
有可选的关键字ALL
,当省略ALL
时,UNION
会自动从结果集中选择DISTINCT
行。
EXAMLE:
SELECT *
FROM tableA
UNION ALL
SELECT *
FROM tableA
这可能导致重复行
ColA ColB
==================
1 John
2 Jade
2 Jade
3 Hello
但如果省略单词ALL
SELECT *
FROM tableA
UNION
SELECT *
FROM tableA
这可能会导致不同的行
ColA ColB
==================
1 John
2 Jade
3 Hello
答案 1 :(得分:6)
你想要的是FULL JOIN
LEFT JOIN
+RIGHT JOIN
=FULL JOIN
所以试试这个:
SELECT * FROM tbl1
LEFT JOIN tbl2 ON tbl1.id = tbl2.id
UNION
SELECT * FROM tbl1
RIGHT JOIN tbl2 ON tbl1.id = tbl2.id
UNION
子句将两个SQL查询的结果合并到一个包含所有匹配行的表中。
答案 2 :(得分:2)
如果你有一个超过2个表的完全连接,这是一个可以轻松扩展的替代方案:
SELECT t1*, t2.*
FROM
( SELECT col
FROM tbl1
UNION
SELECT col
FROM tbl2
) AS d
LEFT JOIN tbl1 AS t1
ON t1.col = d.col
LEFT JOIN tbl2 AS t2
ON t2.col = d.col ;
答案 3 :(得分:1)
你必须使用FULL OUTER JOIN,但mysql不支持它..你可以这样做以获得结果:
SELECT *
FROM tbl1 t1 LEFT JOIN tbl2 t2
ON t1.<col> = t2.<col>
UNION
SELECT *
FROM tbl1 t1 RIGHT JOIN tbl2 t2
ON t1.<col>= t2.<col>