업무를 하던 중 서브 쿼리의 범위에 관한 에러가 발생하였다.
SELECT
(SELECT DEPT_NM
(SELECT D.DEPT_NM AS DEPT_NM
FROM (
SELECT DEPT
ROW_NUMBER() ~ PARTITION () AS RN
FROM USER_DEPT D
WHERE D.USER_ID = U.USER_ID
) WHERE RN = 1
)
) AS DEPT
FROM BOARD B
LEFT JOIN COMMENT C
ON B.BOARD_ID = C.BOARD_ID
LEFT JOIN USER U
ON C.COMMENT_ID = U.USER_ID
WHERE U.USER_ID = '입력된 값'; -- 유저 한 명 정보 나오게 됨
- 이런 쿼리였다.
- 일단 억지로 만들어 냈는데, 게시판에 댓글을 달은 유저 한명의 사번같은걸 넘겨서
- 이 유저의 부서가 어디인지 찾고 싶은 것!
- 스칼라쿼리로 값이 하나가 나와야 한다. (SELECT 절에서)
어떤 문제가 발생하느냐
- 서브 쿼리 안에 서브 쿼리 안에 있는 U.USER_ID 이게 문제였다.
- 바깥쪽의 서브 쿼리 까지는 U. 해서 접근이 가능한데
- 한 단계 더 들어가서 서브 쿼리를 작성하면, 그 쪽 스코프에서는 U. 이걸 접근 할 수 없다.
이렇게 해결했다
SELECT
(SELECT DEPT_NM
(SELECT D.DEPT_NM AS DEPT_NM
FROM (
SELECT D.DEPT
, ROW_NUMBER() ~ PARTITION () AS RN,
, D.USER_ID
FROM USER_DEPT D
) F WHERE F.USER_ID = U.USER_ID AND RN = 1
)
) AS DEPT
FROM BOARD B
LEFT JOIN COMMENT C
ON B.BOARD_ID = C.BOARD_ID
LEFT JOIN USER U
ON C.COMMENT_ID = U.USER_ID
WHERE U.USER_ID = '입력된 값'; -- 유저 한 명 정보 나오게 됨
- 서브쿼리에서 D.USER_ID를 컬럼에 넣어서 가지고 온 후
- 바깥쪽에서 U.USER_ID 와 같은 컬럼을 조회하는 식으로 변경하였다.
- 끝!