2012-08-11 81 views
5

我加入了2個表-tbl1和tbl2。左連接提供來自tbl1的所有數據,這些數據位於tbl2或僅位於tbl1。右連接提供tbl2中不存在的數據。在mysql查詢中合併左右連接

我想結合這兩個結果。

這樣做的最好方法是什麼,以便我從tbl1和tbl2獲取所有數據?

回答

10

的唯一可以做的就是通過使用UNION。就像在MSSQL中一樣,MySQL不支持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 
4

你想要的是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查詢的結果組合成一個單一的所有匹配行的表。

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> 
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 ;