我要加入 2 个表 -tbl1 和 tbl2。左连接给出来自 tbl1 的所有数据,这些数据在 tbl2 中或仅在 tbl1 上。右连接给出了 tbl2 中不存在于 tbl1 中的数据。
我想结合这两个结果。
这样做的最佳方法是什么,以便我从 tbl1 和 tbl2 获取所有数据?
唯一可以做到的就是使用UNION
. MySQLFULL JOIN
不像 MSSQL 那样支持。
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
顺便说一句,UNION
有可选关键字ALL
,当ALL
省略时,会UNION
自动DISTINCT
从结果集中选择行。
示例:
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
你想要的是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 个表的完全连接,则可以轻松扩展以下替代方法:
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 ;
你必须使用 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>