회사/DB

[MSSQL] CROSS APPLY, OUTER APPLY

daykim 2025. 2. 4. 14:05
  • CROSS APPLY와 OUTER APPLY는 JOIN과 동일한 결과값을 반환할 수 있다.
  • 하지만, JOIN과는 다른 실행계획을 가질 수 있고, JOIN 으로는 수행 불가능한 구문을 수행시켜주기도 한다.
  • 서브 쿼리에 외부 테이블의 컬럼을 인자로 사용할 수 있다.
  • 테이블 반환함수의 인자값으로, 외부 테이블의 컬럼을 적용해 JOIN과 같은 결과값을 낼 수 있다.
  • 상황에 따라 JOIN보다 더 좋은 성능을 발휘할 수 있다.

 

CROSS APPLY


SELECT * 
  FROM TBL_A
 CROSS APPLY (
    SELECT * FROM TBL_B
 )
 WHERE ...

 

 

OUTER APPLY


SELECT *
  FROM TBL_A A
 OUTER APPLY (
 	SELECT * FROM TBL_B
    WHERE A.COL1 = B.COL1
 ) B

 

  • 회사에서 JOIN으로 데이터를 조회하는데 데이터가 중복으로 JOIN 되어 원하는 결과값이 나오지 않았다.
  • 그래서 JOIN 대신 OUTER APPLY를 사용해 문제를 해결했다.
SELECT A.COL1                                     			
     , A.COL2                                  			
     , A.COL3                                   			
     , ISNULL(S.COL4, 0) AS COL4		 			
     , ISNULL(S.COL5, 0) AS COL5		 					
  FROM SALEDB.dbo.TABLE_A A WITH(NOLOCK)      			
 OUTER APPLY (
        SELECT SUM(B.COL6) AS COL6		 		
             , SUM(B.COL7) AS COL7		 				
          FROM SALEDB.dbo.TABLE_B B WITH(NOLOCK)	
         WHERE B.COL8 = A.COL1
           AND B.COL9 BETWEEN A.COL2 AND A.COL3
     ) S
 WHERE A.COL1 = '00554055'
  • 당시 사용했던 쿼리를 일부 수정한 것이다.
  • A의 각 행을 돌면서 OUTER APPLY에서 WHERE 절에 해당하는 행들을 JOIN 하는 것이다.

*** GPT

'회사 > DB' 카테고리의 다른 글

[MSSQL] 조회 속도 개선  (0) 2025.02.21
[DB] Index와 Column, 비교연산자  (0) 2024.12.16
[DB / MSSQL] / SELECT - INTO  (0) 2024.11.06
[DB / MSSQL] LOB (Large Object / 대형 오브젝트)  (0) 2024.10.29
[DB / MSSQL] 날짜조회 BETWEEN  (1) 2024.10.28