본문 바로가기
Database(디비)/MSSQL

MSSQL 서브쿼리에 대해

by 대학교닷컴 2013. 11. 26.


SQL 서브쿼리에 대해

 

SELECT 에 사용되는 서브쿼리의 특징과 주의점

SELECT 절에 사용하는 서브쿼리는 스칼라 서브쿼리라고 합니다.

SELECT 절에 기술하였으므로 결과에 대한 검색이됩니다.

따라서 해당 서브쿼리의 반환 행의 개수도 반드시 0 또는 1이어야 합니다.

보통 스칼라서브쿼리의 경우  기준정보 성격의 마스터테이블에 주로 활용합니다.

이는 보통 코드에 맞는 명칭을 검색할때 주로 사용한다고 보시면 됩니다.

 

FROM 에 사용되는 서브쿼리의 특징과 주의점

FROM절에 사용하는 서브쿼리는 인라인뷰라고 합니다.

보통 Query의 재정의라고 하는데요. 원시정보에 대해 어떤 결과를 만들기 위해서

원시데이터를 가공하여 새로운 형태의 정보를 만들어 내어 이를 기준으로

FROM절을 재정의하여 만들어 나가게 됩니다.

아래처럼 예처럼 단순하게 부분적인 컬럼 발취나 * 를 통한 인라인뷰는 큰 효과를 얻을수 없습니다.

FROM ( SELECT * FROM 테이블 )

FROM ( SELECT 이름,전화 FROM 테이블 WHERE 조건절)

 

WHERE 에 사용되는 서브쿼리의 특징과 주의점

보통 Filter Subquery라고 합니다.

상수값이 아닌 어떤 그룹에 속하는 2이상의 정보를 조건으로 활용하고자 할때 사용됩니다.

조건식에 in 이나 Exists 등의 구문에 주로 활용됩니다.

주의사항은 불필요한 Sacan으로 I/O 속도 저하를 가져올수 있습니다.

특히 Exists 구문에 할용된 서브쿼리의 경우 SELECT 절에 특정 컬럼을 정의하실 필요없습니다.

예) 바른예

~~

FROM 테이블1 a

WHERE Exists ( SELECT'*'

                 FROM 테이블2 b

                WHERE b.컬럼 = a.컬럼 )

예) 틀린예

~~

FROM 테이블1 a

WHERE Exists ( SELECT*

                 FROM 테이블2 b

                WHERE b.컬럼 = a.컬럼 )

 

from절을 이용하여 카운트 구하기
select X.ord_code
,  isnull (A ,0 )  +   isnull (B ,0 )  +  isnull (C ,0 )  AS TOT
,  isnull (A ,0 ) A
,  isnull (B ,0 ) B
,  isnull (C ,0 ) C

from Xtendus.DT_Frm_order X ,
(
 select ord_code, count(*) as A
 from Xtendus.DT_Frm_order_item
 where 1=1
 and ord_state = '0'
 group by ord_code
)  A ,
(
 select ord_code, count(*) as B
 from Xtendus.DT_Frm_order_item
 where 1=1
 and ord_state = '1'
 group by ord_code
)  B  ,
(
 select ord_code, count(*) as C
 from Xtendus.DT_Frm_order_item
 where 1=1
 and ord_state = '2'
 group by ord_code
) C
WHERE  X.ord_code *= A.ord_code
and X.ord_code *= B.ord_code
and X.ord_code *= C.ord_code


 

댓글