서브쿼리의 서브쿼리(SUBQUERY)에 쿼리문의 변수 값 가져오는 방법 0 4 1,429

by 구루씨 [SQL Query] [2017.01.26 09:49:52]


쿼리문(A)이 하나가 있고

해당 쿼리문(A)의 서브쿼리(B)가 있습니다.

서브쿼리(B)에서는  A의 컬럼 중 하나를 변수로 받아 실행하는 구문을 넣어봤는데요

실행이 되더라구요!

ex)

select A.name,

A.job,

A.dept

(select dept

from department

where name = A.name)  ㅡ ㅡ ㅡ ㅡ  서브쿼리 (B)

from employee A      ㅡ ㅡ ㅡ ㅡ ㅡ  쿼리문 (A)

 

그런데 안되는 경우도 있더군요,

바로, 서브쿼리(B) 결과 값이 1개가 아닌 여러개인 경우!

그래서

해당 결과값에서 쿼리문(A)의 결과 값 중 하나를 또 조건에 주기위해

서브쿼리(B)를 다음과 같이 변화를 주었습니다.

select sub.dept

from (select dept

from department

where name = A.name) sub

where sub.dept = A.dept

 

결과적으로

select A.name,

A.job,

A.dept

( select sub.dept

from (select dept

from department

where name = A.name) sub

where sub.dept = A.dept )  ㅡ ㅡ ㅡ ㅡ  서브쿼리 (B) 변화를 줌 (B')

from employee A      ㅡ ㅡ ㅡ ㅡ ㅡ  쿼리문 (A)

 

이렇게 쿼리를 날렸는데

변화를 준 서브쿼리문 (B')에서 A.dept는 쿼리문 (A)의 변수값을 가져오는데

그 안의 서브쿼리(B)와 동일한 부분의 A.name은 값을 가져오지 못하네요.

 

뭔가 뫼비우스 띄 구조인것 같기도하고

어떻게 처리해야될까요 ㅠㅠ

 

결론 : 서브 쿼리의 서브쿼리에서 쿼리문의 변수 값을 가져오는 방법이 궁금합니다!

by Kyle [2017.01.26 09:56:26]

select 절에 들어가는 서브쿼리는 2 depth 로 들어가면 오류가 납니다

따라서 해당 쿼리를 1 depth 만 들어가도록 수정해야 합니다.

 

SELECT 
    A.NAME, 
    A.JOB, 
    (
        SELECT DEPT 
        FROM DEPARTMENT 
        WHERE NAME = A.NAME AND DEPT = A.DEPT
    ) ALT_DEPT
FROM EMPLOYEE A

 


by 구루씨 [2017.01.26 14:04:44]

감사합니다


by jkson [2017.01.26 10:23:11]

예시 쿼리라 저렇게 표현한 것이지 실제로 2 DEPTH를 풀기 까다로우신 게 아닐까 하는데요.

실제로 2 DEPTH를 풀기가 애매할 때는..

SELECT COL1
     , (SELECT COL2
          FROM (SELECT COL2
                  FROM TABLE_B B
                 WHERE B.COL3 = A.COL3
                 ORDER BY COL4
               ) C
         WHERE ROWNUM = 1  ) COL2               
  FROM TABLE_A A
 WHERE COL5= 'A'
 
--스칼라서브쿼리에서 메인테이블 A의 COL3을 인식 못하므로 오류

-->  
 
--스칼라서브쿼리에서 SELECT 절에 COL3을 추가하고 1 DEPTH에서 조회 조건 추가
SELECT COL1
     , (SELECT ACOL2
          FROM (SELECT COL3, COL2
                  FROM TABLE_B B
                 ORDER BY COL4
               ) C
         WHERE C.COL3 = A.COL3
           AND ROWNUM = 1  ) COL2               
  FROM TABLE_A A
 WHERE COL5 = 'A'

 


by 구루씨 [2017.01.26 14:05:20]

네 맞아요 ㅠㅠ 예를 잘못들었나보네요

덕분에 잘 이해가 되었습니다.

감사합니다!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입