MySQL FULL JOIN?

Los siguientes son mi consulta y quiero el resultado que se muestra a continuación. ¿Cómo puedo hacer esto en mysql?

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo FROM Persons FULL JOIN Orders ON Persons.P_Id=Orders.P_Id ORDER BY Persons.LastName 

El conjunto de resultados debe verse así:

 LastName FirstName OrderNo Hansen Ola 22456 Hansen Ola 24562 Pettersen Kari 77895 Pettersen Kari 44678 Svendson Tove 34764 

MySQL carece de soporte para FULL OUTER JOIN.

Entonces, si quiere emular una unión completa en MySQL, eche un vistazo aquí .

Una solución sugerida comúnmente se ve así:

 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 
 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 ) 

Varios tipos de combinaciones, por ejemplo

Hay un par de métodos para completar mysql FULL [OUTER] JOIN.

  1. UNION a left join y right join. UNION eliminará duplicados realizando una operación ORDER BY. Entonces, dependiendo de sus datos, puede que no sea de rendimiento.

      SELECT * FROM A LEFT JOIN B ON A.key = B.key UNION SELECT * FROM A RIGHT JOIN B ON A.key = B.key 
  2. UNION ALL una combinación left y una combinación EXCLUYENTE (es la figura inferior derecha en el diagtwig). UNION ALL no eliminará duplicados. A veces este podría ser el comportamiento que desea. También desea utilizar DERECHO EXCLUYENTE para evitar la duplicación de registros comunes de la selección A y la selección B, es decir, la combinación a la izquierda ya ha incluido registros comunes de la selección B, no repetir eso nuevamente con la combinación correcta.

      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 

Prueba esto:

 (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 | +----------+-----------+---------+ 

Hm, combinando LEFT y RIGHT JOIN con UNION podría hacer esto:

 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 

Unirse por completo en mysql: (left union right) o (left onein left)

  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