LATERAL
1. LATERAL
MySQL 8.0.14 버전부터 LATERAL 파생 테이블이라는 기능을 지원한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT a.dept_no,
a.dept_name,
mng.emp_no,
mng.first_name,
mng.last_name
FROM departments a,
(SELECT b.dept_no, b.emp_no, c.first_name, c.last_name
FROM dept_manager b,
employees c
WHERE b.emp_no = c.emp_no
AND SYSDATE() BETWEEN b.from_date AND b.to_date
AND a.dept_no = b.dept_no
) mng
ORDER BY 1;
위의 쿼리는 실행하면 오류가 난다. 오류 메시지에 따르면 WHERE 절에서 a.dept_no
라는 컬럼을 알 수 없다고 한다. 이는 파생 테이블의 WHERE 절 맨 마지막 조건인 a.dept_no = b.dept_no
부분에서 a.dept_no
를 인식하지 못해 발생한 오류이다.
여기서 a.dept_no
는 메인쿼리의 FROM 절에 명시한 departments 테이블에 있는 컬럼인데, 서브쿼리에서는 메인쿼리의 컬럼을 참조하지 못한다. 따라서 서브쿼리와의 조인 조건은 메인쿼리의 WHERE 절에 기술해야 한다.
그러나 MySQL 8.0.14 버전부터는 LATERAL이라는 키워드로 서브쿼리 안에서도 메인쿼리의 FROM 절에 있는 테이블의 칼럼을 참조할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT a.dept_no,
a.dept_name,
mng.emp_no,
mng.first_name,
mng.last_name
FROM departments a,
LATERAL
(SELECT b.dept_no, b.emp_no, c.first_name, c.last_name
FROM dept_manager b,
employees c
WHERE b.emp_no = c.emp_no
AND SYSDATE() BETWEEN b.from_date AND b.to_date
AND a.dept_no = b.dept_no
) mng
ORDER BY 1;
오류가 난 서브쿼리 바로 앞에 LATERAL 키워드를 추가했다. 이렇게 하면 서브쿼리의 WHERE 절에서 메인쿼리의 FROM 절에 있는 테이블의 칼럼을 참조한다. LATERAL 덕분에 조인 조건을 서브쿼리 안에서도 사용할 수 있게 되었다.
다음과 같이 INNER JOIN 구문으로 바꿔 쓸 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT a.dept_no,
a.dept_name,
mng.emp_no,
mng.first_name,
mng.last_name
FROM departments a
INNER JOIN LATERAL
(SELECT b.dept_no, b.emp_no, c.first_name, c.last_name
FROM dept_manager b,
employees c
WHERE b.emp_no = c.emp_no
AND SYSDATE() BETWEEN b.from_date AND b.to_date
AND a.dept_no = b.dept_no
) mng
ORDER BY 1;
위의 쿼리는 INNER JOIN 구문으로 파생 테이블과 내부 조인한다. 서브쿼리 밖에 ON 절로 조인 조건을 기술해야 하는데, LATERAL 키워드 덕분에 메인쿼리의 테이블을 참조할 수 있어서 서브쿼리안에 조인 조건 기술이 가능하다.
[출처 및 참고]
This post is licensed under CC BY 4.0 by the author.