서브쿼리와 집계함수의 연관관계 질문합니다. 0 3 2,419

by 제일 [2013.01.28 10:36:11]


안녕하세요.

제가 이번에 쿼리를 만들면서 궁금한 것이 있는데 바로 서브쿼리와 집계함수간의 연관관계에 대해서

질문을 드리고자 합니다.


       SELECT A.REL_SYS_CD
                   , A.MENU_CD
                   , A,MENU_NM
                   , (SELECT MIN(B.DP_SEQ) FROM PT_SYSRIGHTGB) AS DP_SEQ
          FROM V_CP_MENU_INFO A
                  , PT_SYSRIGHTGB B
       WHERE MENU_LEVEL = 1
            AND B.R_GROUPCD = '화면에서 받아오는 변수'

함축적으로 설명하자면 위의 쿼리의 작동방식에 대한 의문점입니다.

이해가 쉽기 위해 여러줄의 조인도 생략하고 조건도 생략하여 함축적으로 표현햇습니다.

상황은 A와 B의 테이블에서 여러 조건들을 걸고나서, 그 조회조건의 결과가 DP_SEQ가 1,3,9인 결과값들중에

서브쿼리를 이용해서 집계함수 MIN을 사용하여 1,3,9의 결과값중 DP_SEQ가 1의 결과값들만 호출하고 싶었는데

저렇게 해도 1,3,9가 다 표현되어 조회가 되더군요.

논리적으로 어떠한 부분이 잘못 쓰였는지 궁금해서 질문을 드리게 되었습니다.


by 아린 [2013.01.28 11:26:04]
 SELECT A.REL_SYS_CD
     , A.MENU_CD
     , A,MENU_NM
     , (SELECT MIN(B.DP_SEQ) FROM PT_SYSRIGHTGB) AS DP_SEQ
  FROM V_CP_MENU_INFO A
     , PT_SYSRIGHTGB B
 WHERE MENU_LEVEL = 1
   AND B.R_GROUPCD = '화면에서 받아오는 변수'

MIN(B.DP_SEQ) => MIN(DP_SEQ) 바꾸셔야 겠네요.

위쿼리는 아래와 같아요. 즉 서브쿼리를 사용하는게 아니라 "PT_SYSRIGHTGB B" 요걸 사용하죠.

SELECT A.REL_SYS_CD
     , A.MENU_CD
     , A,MENU_NM
     , MIN(B.DP_SEQ)
  FROM V_CP_MENU_INFO A
     , PT_SYSRIGHTGB B
 WHERE MENU_LEVEL = 1
   AND B.R_GROUPCD = '화면에서 받아오는 변수'


아래 SCOTT 계정의 emp 와 dept 보시면 이해가 쉬울듯하네요.

SELECT e.empno, e.ename, e.deptno, d.dname
     , e.sal                              
     , (SELECT MIN(e.sal) FROM emp) sal_2  
     , (SELECT MAX(e.sal) FROM emp) sal_3
     , (SELECT MIN(sal)   FROM emp) sal_4
  FROM emp e, dept d
 WHERE e.deptno = d.deptno 
   AND e.deptno IN ('10', '20')
 ORDER BY e.deptno, e.sal  

empno  ename  deptno   dname      sal   sal_1   sal_2  sal_3
--------------------------------------------------------------
7934 MILLER 10   ACCOUNTING  1300 1300 1300 800
7782    CLARK   10   ACCOUNTING  2450   2450    2450    800
7839    KING    10   ACCOUNTING  5000   5000    5000    800
7369    SMITH   20   RESEARCH     800    800     800    800
7876    ADAMS   20   RESEARCH    1100   1100    1100    800
7566    JONES   20   RESEARCH    2975   2975    2975    800
7788    SCOTT   20   RESEARCH    3000   3000    3000    800
7902 FORD 20   RESEARCH  3000 3000 3000 800

by 제일 [2013.01.28 11:38:06]
DP_SEQ로 바꾸게 되면 제가 동적쿼리로 사용하기 위한 의미가 깨져버립니다.
DP_SEQ로 MIN값을 설정하면 1,3,9일때도 1을 뽑지만 3,9일때는 3을 뽑고 싶거든요
화면에서 받아오는 변수에 따라 DP_SEQ의 갯수와 값이 달리 가지고 잇는데
DP_SEQ로 해버리면 무조건 1만 받아와 버리는 문제가 있네요 ㅠ.ㅠ

by 마농 [2013.01.28 11:39:38]

Select 절의 서브쿼리는 단일값만 조회하는 스칼라서브쿼리입니다.
스칼라서브쿼리는 메인쿼리의 결과에 아무런 영향을 주지 않습니다.
메인쿼리 결과 + 부가적인 정보 조회 하는 쿼리라고 생각하시면 됩니다.
원하시는 결과가 메인쿼리의 결과가 바뀌길 원하시는지?
아니면 메인쿼리의 결과는 그대로 부가적인 정보를 추가하고자 함인지?
잘 판단하시길 바랍니다.
분석함수를 사용하면 쿼리가 좀더 간단해 질수도 있구요.
원하시는 결과를 좀더 명확하게 표현해 주세요.

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