在MySQL查询中组合使用左连接和右连接

ffscu2ro  于 2023-01-16  发布在  Mysql
关注(0)|答案(4)|浏览(193)

我正在连接两个表-tbl 1和tbl 2。左连接给予了tbl 1中位于tbl 2中或仅位于tbl 1上的所有数据。右连接提供了tbl 2中不存在于tbl 1中的数据。
我想把两个结果结合起来。
要从tbl 1和tbl 2获取所有数据,最好的方法是什么?

c2e8gylq

c2e8gylq1#

你唯一能做的就是使用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
    • 一个

顺便说一下,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
6tr1vspr

6tr1vspr2#

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

fnx2tebb

fnx2tebb3#

下面是一个替代方法,如果您有超过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 ;
0vvn1miw

0vvn1miw4#

你必须使用完全外部连接,但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>

相关问题