13

我要加入 2 个表 -tbl1 和 tbl2。左连接给出来自 tbl1 的所有数据,这些数据在 tbl2 中或仅在 tbl1 上。右连接给出了 tbl2 中不存在于 tbl1 中的数据。

我想结合这两个结果。

这样做的最佳方法是什么,以便我从 tbl1 和 tbl2 获取所有数据?

4

4 回答 4

20

唯一可以做到的就是使用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

在这里查看:在 MYSQL 中模拟 FULL JOIN

顺便说一句,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
于 2012-08-11T08:26:38.370 回答
8

你想要的是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 查询的结果组合到一个包含所有匹配行的表中。

于 2012-08-11T07:36:49.477 回答
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 ;
于 2012-08-11T09:14:32.713 回答
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> 
于 2012-08-11T07:37:33.413 回答