MySQL完全加入?

34 mysql

以下是我的查询,我想要的结果如下所示.我怎么能在mysql中这样做?

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.P_Id=Orders.P_Id
ORDER BY Persons.LastName
Run Code Online (Sandbox Code Playgroud)

结果集需要如下所示:

LastName      FirstName     OrderNo
Hansen        Ola          22456
Hansen        Ola          24562
Pettersen     Kari         77895
Pettersen     Kari         44678
Svendson      Tove   
                           34764
Run Code Online (Sandbox Code Playgroud)

ale*_*oot 34

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
Run Code Online (Sandbox Code Playgroud)


a20*_*a20 27

各种类型的连接,用于说明

完整的mysql FULL [OUTER] JOIN有几种方法.

  1. 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
    
    Run Code Online (Sandbox Code Playgroud)
  2. 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
    
    Run Code Online (Sandbox Code Playgroud)


Qua*_*noi 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
        )
Run Code Online (Sandbox Code Playgroud)


小智 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 |
+----------+-----------+---------+
Run Code Online (Sandbox Code Playgroud)

  • 重要的是要观察到使用了“ UNION”,而不是“ UNION ALL”。 (2认同)
  • 这里使用UNION,它将删除重复项并执行排序操作。如果您想要性能更高的查询或者想要保留重复项,请使用 UNION ALL。 (2认同)