2012-08-11 7 views
5

Ich bin 2 Tabellen -tbl1 und tbl2 beitreten. Linke Verknüpfung geben alle Daten von tbl1, die in tbl2 oder nur auf tbl1 ist. Right Join gibt Daten von tbl2, die in tbl1 nicht existieren.Links und rechts verbinden Join in mysql Abfrage

Ich möchte beide Ergebnisse kombinieren.

Was ist der beste Weg, dies zu tun, damit ich alle Daten von tbl1 und tbl2 bekomme?

Antwort

10

Die Sie nur das tun kann, ist durch UNION verwenden. MySQL unterstützt FULL JOIN nicht wie in 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 

SEE HERE: Simulating FULL JOIN in MYSQL

Durch die Art und Weise, UNION optional Schlüsselwort hat ALL, wenn die ALL weggelassen wird, wählt automatisch UNIONDISTINCT Zeilen aus der Ergebnismenge.

examle:

SELECT * 
FROM tableA 
UNION ALL 
SELECT * 
FROM tableA 

diese Duplikate führen können Zeilen

ColA ColB 
================== 
1  John 
2  Jade 
2  Jade 
3  Hello 

aber wenn man weglassen das Wort ALL

SELECT * 
FROM tableA 
UNION 
SELECT * 
FROM tableA 

diese unterschiedlichen Zeilen führen nur

ColA ColB 
================== 
1  John 
2  Jade 
3  Hello 
4

Was Sie wollen, ist FULL JOIN

LEFT JOIN + RIGHT JOIN = FULL JOIN

diese So versuchen:

SELECT * FROM tbl1 
LEFT JOIN tbl2 ON tbl1.id = tbl2.id 
UNION 
SELECT * FROM tbl1 
RIGHT JOIN tbl2 ON tbl1.id = tbl2.id 

Die UNION Klausel die Ergebnisse von zwei SQL-Abfragen in einem einzigen vereint Tabelle aller übereinstimmenden Zeilen.

1

müssen Sie FULL OUTER JOIN, aber MySQL tut es unterstützen .. Sie diese Option, um das Ergebnis tun könnte:

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

Hier ist eine Alternative, die einfach erweitert werden können, wenn Sie ein voll von mehr als 2 Tabellen beitreten:

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 ;