2012-08-11 9 views
5

Dołączam do 2 tabel -tbl1 i tbl2. Left join daje wszystkie dane z tbl1, które jest w tbl2 lub tylko na tbl1. Prawe sprzężenie daje dane z tbl2, którego nie ma w tbl1.Łączenie lewego i prawego łączenia w zapytaniu mysql

Chcę połączyć oba wyniki.

Jaki jest najlepszy sposób, aby uzyskać wszystkie dane z tbl1 i tbl2?

Odpowiedz

10

Jedynym można zrobić to za pomocą UNION. MySQL nie obsługuje FULL JOIN, podobnie jak w 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

Nawiasem mówiąc, UNION posiada opcjonalną słowa kluczowego ALL, gdy ALL zostanie pominięty, UNION automatycznie wybiera DISTINCT wiersze z wynikowego.

examle:

SELECT * 
FROM tableA 
UNION ALL 
SELECT * 
FROM tableA 

może to spowodować duplikaty wierszy

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

ale jeśli pominąć słowo ALL

SELECT * 
FROM tableA 
UNION 
SELECT * 
FROM tableA 

może to spowodować różne wiersze tylko

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

Co chcesz jest FULL JOIN

LEFT JOIN + RIGHT JOIN = FULL JOIN

Więc spróbuj tego:

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

Klauzula UNION łączy wyniki dwóch zapytań SQL do pojedynczego tabela wszystkich pasujących wierszy.

1

trzeba użyć FULL OUTER JOIN, ale mysql robi wspierać to .. Można zrobić to na uzyskanie rezultatu:

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

Oto alternatywa, że ​​można łatwo rozszerzyć, jeśli masz pełny dołączyć więcej niż 2 tabele:

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 ; 
Powiązane problemy