Подтвердить что ты не робот

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
4b9b3361

Ответ 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