Объединение левого и Правого соединения в запросе mysql


Я соединяю 2 таблицы-tbl1 и tbl2. Левое соединение дает все данные из tbl1, который находится в tbl2 или только на tbl1. Правое соединение дает данные из tbl2, которые не существуют в tbl1.

Я хочу объединить оба результата.

Как лучше всего это сделать, чтобы я получил все данные из tbl1 и tbl2 ?

4 7

4 ответа:

Единственное, что вы можете сделать, это использовать UNION. MySQL не поддерживает FULL JOINтак же, как в 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

Смотрите здесь: имитация полного соединения в 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

Чего ты хочешь, так это 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 таблиц:

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 ;

Вы должны использовать полное внешнее соединение, но 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>