programing

MySQL FULL JOIN?

minimums 2023. 10. 30. 20:50
반응형

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

MySQL은 FULL OUTER JOIN을 지원하지 않습니다.

MySQL에서 Full join을 에뮬레이트하려면 여기를 살펴보십시오.

일반적으로 제안되는 해결 방법은 다음과 같습니다.

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

Various types of joins, for illustration

full 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
    
  2. UNION ALL 왼쪽 조인과 오른쪽 조인 제외(그림의 오른쪽 하단 그림입니다).UNION ALL은 중복을 제거하지 않습니다.때로는 이것이 당신이 원하는 행동일 수도 있습니다.선택 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
    
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
        )

시도해 보기:

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

흠, 좌파와 우파의 결합과 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

mysql의 전체 가입 :(왼쪽 조합 오른쪽) 또는 (오른쪽 unoin 왼쪽)

 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

또 다른 방법은 임시 테이블과 INSERT ON DUMPICE KEY를 이렇게 사용하는 것입니다.

샘플 데이터 만들기:

CREATE TABLE A (
AKEY INT PRIMARY KEY,
AVALUE DOUBLE
);

INSERT INTO A VALUES(1, 0.1); 
INSERT INTO A VALUES(2, 0.2);

CREATE TABLE B (
BKEY INT PRIMARY KEY,
BVALUE DOUBLE
);

INSERT INTO B VALUES(2, 0.2);
INSERT INTO B VALUES(3, 0.3);

표 A 데이터:

AKEY|AVALUE|
----+------+
   1|   0.1|
   2|   0.2|

표 B 데이터:

BKEY|BVALUE|
----+------+
   2|   0.2|
   3|   0.3|

임시 테이블 만들기:

CREATE TEMPORARY TABLE ABFULLJOIN (
ABKEY INT PRIMARY KEY,
AVALUE DOUBLE,
BVALUE DOUBLE
);

중복 키 문장에 삽입:

INSERT INTO ABFULLJOIN(ABKEY, AVALUE)
SELECT * FROM A;

INSERT INTO ABFULLJOIN(ABKEY, BVALUE)
SELECT * FROM B ON DUPLICATE KEY UPDATE BVALUE = B.BVALUE ;

전체 조인 쿼리:

SELECT * FROM ABFULLJOIN;

결과:

ABKEY|AVALUE|BVALUE|
-----+------+------+
    1|   0.1|      |
    2|   0.2|   0.2|
    3|      |   0.3|

DROP 임시 테이블:

DROP TABLE ABFULLJOIN;

여기 모두가 맞지만 같은 쿼리를 두 번 쓰는 것은 좋은 프로그래밍 방법이 아닙니다... 그래서 저는 다음과 같은 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

언급URL : https://stackoverflow.com/questions/7978663/mysql-full-join

반응형