MySQL FULL JOIN?
Ниже приведен мой запрос, и я хочу получить результат, приведенный ниже. Как я могу сделать это в mysql?
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName
Результирующий набор должен выглядеть так:
LastName FirstName OrderNo
Hansen Ola 22456
Hansen Ola 24562
Pettersen Kari 77895
Pettersen Kari 44678
Svendson Tove
34764
Ответы
Ответ 1
MySQL не поддерживает поддержку FULL OUTER JOIN.
Итак, если вы хотите эмулировать полное соединение в MySQL, посмотрите здесь.
Обычно предлагаемое обходное решение выглядит следующим образом:
SELECT t_13.value AS val13, t_17.value AS val17
FROM t_13
LEFT JOIN
t_17
ON t_13.value = t_17.value
UNION ALL
SELECT t_13.value AS val13, t_17.value AS val17
FROM t_13
RIGHT JOIN
t_17
ON t_13.value = t_17.value
WHERE t_13.value IS NULL
ORDER BY
COALESCE(val13, val17)
LIMIT 30
Ответ 2
![Различные типы объединений, для иллюстрации]()
Существует несколько методов для полного mysql FULL [OUTER] JOIN.
-
UNION - объединение влево и вправо.
UNION удалит дубликаты, выполнив операцию ORDER BY.
Поэтому в зависимости от ваших данных это может быть неэффективным.
SELECT * FROM A
LEFT JOIN B ON A.key = B.key
UNION
SELECT * FROM A
RIGHT JOIN B ON A.key = B.key
-
СОЕДИНЕНИЕ ВСЕ левое объединение и правое ИСКЛЮЧЕНИЕ объединяются (что нижняя правая фигура на диаграмме). UNION ALL не удаляет дубликаты. Иногда это может быть поведение, которое вы хотите. Вы также хотите использовать ПРАВИЛЬНОЕ ИСКЛЮЧЕНИЕ, чтобы избежать дублирования общих записей из выбора A и выбора B - i.e Левое объединение уже включило общие записи из выбора B, позволяет не повторять это снова с помощью правого соединения.
SELECT * FROM A
LEFT JOIN B ON A.key = B.key
UNION ALL
SELECT * FROM A
RIGHT JOIN B ON A.key = B.key
WHERE A.key IS NULL
Ответ 3
SELECT p.LastName, p.FirstName, o.OrderNo
FROM persons AS p
LEFT JOIN
orders AS o
ON o.orderNo = p.p_id
UNION ALL
SELECT NULL, NULL, orderNo
FROM orders
WHERE orderNo NOT IN
(
SELECT p_id
FROM persons
)
Ответ 4
Попробуйте следующее:
(SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p
LEFT JOIN Orders o
ON o.OrderNo = p.P_id
)
UNION
(SELECT p.LastName, p.FirstName, o.OrderNo
FROM Persons p
RIGHT JOIN Orders o
ON o.OrderNo = p.P_id
);
+----------+-----------+---------+
| LastName | FirstName | OrderNo |
+----------+-----------+---------+
| Singh | Shashi | 1 |
| Yadav | Sunil | NULL |
| Singh | Satya | NULL |
| Jain | Ankit | NULL |
| NULL | NULL | 11 |
| NULL | NULL | 12 |
| NULL | NULL | 13 |
+----------+-----------+---------+
Ответ 5
Hm, объединяя LEFT и RIGHT JOIN с UNION, может сделать это:
SELECT p.LastName, p.FirstName, o.OrderNo
FROM persons AS p
LEFT JOIN
orders AS o
ON p.P_Id = Orders.P_Id
UNION ALL
SELECT p.LastName, p.FirstName, o.OrderNo
FROM persons AS p
RIGHT JOIN
orders AS o
ON p.P_Id = Orders.P_Id
WHERE p.P_Id IS NULL
Ответ 6
Полное соединение в mysql: (левое объединение справа) или (справа опущено слева)
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
left JOIN Orders
ON Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName
Union
SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
Right JOIN Orders
ON Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName
Ответ 7
Все здесь правы, но написание одного и того же запроса дважды не является хорошим способом программирования... поэтому у меня есть другой способ сделать полное соединение в MySQL, который заключается в следующем
SELECT
user_id , user_name, user_department
FROM
(SELECT
user_id , user_name , NULL as user_department
FROM
tb_users
UNION
SELECT
user_id ,NULL as user_name , user_department
FROM
tb_departments
) as t group by user_id