본문 바로가기

데이터베이스

Cross Apply와 Outer Apply 차이

Sql Server는 table valued functions을 지원한다. table valued functions는 테이블 형태의 데이터를 반환하는 함수이다.

 

join 은 2개 이상의 테이블에 대해 합집합, 교집합의 연산을 한다. 

 

이 join은 table valued function에 대해서는 지원하지 않는다. 

 

이에 대한 대안으로 Apply operator를 제공한다. 

 

Apply operator에는 cross apply와 outer apply가 존재한다.

 

cross apply operator는 inner join 과 유사하다. 

 

table valued function과 일반 테이블 사이에 매칭 되는 행들만을 조회한다. 

 

반대로 outer apply는 매칭을 무시하고 모든 데이터를 조회한다. 

 

사전 준비로 아래 스크립트를 실행 바란다. 

CREATE TABLE Author

(

    id INT PRIMARY KEY,

    author_name VARCHAR(50) NOT NULL,

    

)

 

CREATE TABLE Book

(

    id INT PRIMARY KEY,

    book_name VARCHAR(50) NOT NULL,

    price INT NOT NULL,

    author_id INT NOT NULL

  

)

 

USE Library;

 

INSERT INTO Author

 

VALUES

(1, 'Author1'),

(2, 'Author2'),

(3, 'Author3'),

(4, 'Author4'),

(5, 'Author5'),

(6, 'Author6'),

(7, 'Author7')

 

 

INSERT INTO Book

 

VALUES

(1, 'Book1',500, 1),

(2, 'Book2', 300 ,2),

(3, 'Book3',700, 1),

(4, 'Book4',400, 3),

(5, 'Book5',650, 5),

(6, 'Book6',400, 3)

 

먼저 Inner join을 해보자

SELECT A.author_name, B.id, B.book_name, B.price

FROM Author A

INNER JOIN Book B

ON A.id = B.author_id

inner join 결과

Author 테이블이 Book 테이블에 매칭 되는 행만 조회된 것을 볼 수 있다. 

 

Author 테이블의 모든 레코드들을 조회하고 싶다면 left join을 사용해야 한다. 

 

SELECT A.author_name, B.id, B.book_name, B.price

FROM Author A

LEFT JOIN Book B

ON A.id = B.author_id

left join 결과

Author 테이블의 모든 레코드가 Book 테이블의 매칭 되는 rows는 무시하고 모두 조회된 것을 볼 수 있다. 

 

table valued functions과 table을 Apply operator를 이용해서 join 시켜보겠다.

 

그전에 table valued function을 생성한다.

CREATE FUNCTION fnGetBooksByAuthorId(@AuthorId int)

RETURNS TABLE

AS

RETURN

(

SELECT * FROM Book

WHERE author_id = @AuthorId

)

생성한 함수를 테이블처럼 사용할 수 있다. 

SELECT * FROM fnGetBooksByAuthorId(3)

#  cross apply 

cross apply는 inner join과 유사하다.  테이블과 table valued function의 반환 결과와 일치하는 레코드들만이 조회된다.

 

SELECT A.author_name, B.id, B.book_name, B.price

FROM Author A

CROSS APPLY fnGetBooksByAuthorId(A.Id) B

 

위 스크립트를 보면 Author은 모든 id를 fnGetBooksByAuthorId function에 전달한다. 이 각각의 id에 대해 그 함수는 대응하는 book 테이블의 레코드들을 반환한다. 그 결과 table valued function과 Author테이블은 join 된다. 

 # outer apply

outer apply는 outer join과 유사하다.

 

SELECT A.author_name, B.id, B.book_name, B.price

FROM Author A

OUTER APPLY fnGetBooksByAuthorId(A.Id) B

 

table valued function에 결과와 매칭 되는 여부와는 관계없이 Author 테이블의 모든 레코드가 조회된다. 

# 결론

cross apply와 outer apply는 실제 물리적으로 저장된 테이블과 table valued function에 대해 join연산을 수행한다. 

 

'데이터베이스' 카테고리의 다른 글

SQL Server DATEDIFF, DATEADD , DatePart  (0) 2020.06.15
SQL Server CURSOR  (0) 2020.06.13
테이블 변수(SQL Server Table Variables)  (0) 2020.06.11
임시 테이블 Temporary Tables  (0) 2020.06.10
SQL Server TRY CATCH  (0) 2020.06.09