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
full 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 왼쪽 조인과 오른쪽 조인 제외(그림의 오른쪽 하단 그림입니다).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
'programing' 카테고리의 다른 글
각도 변환을 사용하여 번역을 표시하는 방법은 무엇입니까? (0) | 2023.10.30 |
---|---|
각.json과 $scope의 차이.$eval을 JSON 문자열에 적용할 경우 (0) | 2023.10.30 |
css 내용 다음 또는 내용 이전에 의사:"를 회전합니다." (0) | 2023.10.30 |
html 요소에 대한 onclick 이벤트에 대한 data-* 특성 가져오기 (0) | 2023.10.30 |
DEFAULT NULL이 있는 MySQL 열 - 스타일리시한 선택입니까? (0) | 2023.10.25 |