以下是我的查询,我想要的结果如下所示。我怎么能在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
答案 0 :(得分:33)
MySQL缺乏对FULL OUTER JOIN的支持。
因此,如果您想在MySQL上模拟完全加入,请查看here。
通常建议的解决方法如下所示:
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
答案 1 :(得分:23)
完整的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左连接和右EXCLUDING连接(图中的右下图)。 UNION ALL不会删除重复项。有时这可能是您想要的行为。您还希望使用RIGHT EXCLUDING来避免重复选择A和选择B中的常见记录 - 即左连接已包含选择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
答案 2 :(得分:13)
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
)
答案 3 :(得分:5)
试试这个:
(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 |
+----------+-----------+---------+
答案 4 :(得分:1)
嗯,将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
答案 5 :(得分:0)
完全加入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
答案 6 :(得分:-1)
每个人都是正确的,但是两次编写相同的查询并不是编程的好方法... 所以我有另一种方法可以在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