结合左派和左派正确加入mysql查询

时间:2012-08-11 07:28:13

标签: mysql join left-join

我正在加入2个表-tbl1和tbl2。左连接提供来自tbl1的所有数据,该数据在tbl2中或仅在tbl1上。右连接提供来自tbl2的数据,这在tbl1中是不存在的。

我想结合两种结果。

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

4 个答案:

答案 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>