SQL Server apply 쿼리 사용방법과 join 쿼리와의 차이점
Sql server 2005 버전부터 소개된 apply 는 join 쿼리와 유사하지만 테이블 형식 리턴 함수나 corelated subquery 를 테이블 대신 사용할수 있다. 또한 왼쪽 테이블의 값을 테이블 리턴 함수나 corelated subquery 의 인자로 사용할 수 있어서 왼쪽 테이블 값에 따라 데이터를 처리하여 나온 결과값을 왼쪽 테이블 데이터와의 결합에 사용할 수 있다. 하나의 필드값 만이 필요할 때는 Scala 함수를 이용하여 select 리스트에 함수를 호출하면 되지만 입력 변수에 따라 여러 필드를 동시에 가져와야할 경우 나 내부 함수처리를 통해 데이터를 만들어야 할 경우 apply가 매우 유용한 구문이 될 수 있다.
Apply 실행시 오른쪽 테이블 리턴함수 또는 서브쿼리는 각 레코드에 대해서 각각 평가된다.
Apply 에는 cross apply 와 outer apply 가 있는데
cross apply 는 테이블 리턴함수 또는 corelated subquery를 사용할수 있다는것을 제외하고 inner join 과 같은 결과를 가져온다.
Outer apply 는 테이블 리턴함수 또는 corelated subquery를 사용할 수 있다는 것을 제외하고 left outer join 과 같은결과를 가져온다. 따라서 outer apply 는 오른쪽 테이블 리턴함수 또는 corelated subquery에서 리턴되는 데이터가 없더라도 결과 값을 반환하지만 오른쪽 테이블 리턴함수 또는 corelated subquery의 칼럼들은 null 을 반환한다.
일반적인 join 을 이용하여 쿼리할수 있는데 굳이 apply 를 사용해야 하는 의문이 들수 있다. 하지만 테이블 반환함수를 오른쪽 테이블 반환함수나 서브쿼리에 왼쪽 테이블의 값을 인자로 제공할 수 있다는 특징이 있다. 이것은 join 쿼리로 구현할 수 없는 기능이다.
또한 성능점검을 위한 Dynamic Management Function (DMF) 사용시에도 apply 는 매우 유용한 구문이 된다.
Apply 에는 join 에서와 같은 on 절을 사용하지 않는다. 오른쪽 테이블 반환 함수나 corelated subquery 에 리턴되는 결과값이 있으면 해당 결과값의 레코드 수만큼 결과집합은 수가 늘어나게 된다.
왼쪽 테이블에도 테이블 리턴 함수를 사용할 수 있지만 오른쪽 테이블의 레코드 값을 인자로 사용할 수는 없다.
USE master GO SELECT DB_NAME(r.database_id) database, st.[text] query FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.plan_handle) st WHERE r.session_Id > 50 -- 시스템 spid 를 배제하기 위해 AND r.session_Id NOT IN (@@SPID) -- 현재 spid 를 배제하기 위해
'SQL Server' 카테고리의 다른 글
SQL Server intersect ,except 는 join(조인), union(유니온) 과 무엇이 다른가? (0) | 2019.02.19 |
---|---|
SQL Server 에서 객체 존재여부 체크(테이블, 함수, 프로시져등) (0) | 2019.02.09 |
SQL Server 테이블 데이터 중복제거 방법 (0) | 2019.02.09 |
SQL Server 조인(join) 을 이용한 데이터 업데이트 방법 (0) | 2019.02.09 |
SQL Server default 제약조건(constraint) 추가, 변경, 제거 (0) | 2019.02.09 |