2016-06-13 1 views
2

TVF (테이블 반환 함수)를 사용하는 내부 조인과 동일한 것은 CROSS APPLY (TVF와 함께 내부 결합 인 cannot)을 사용하는 것입니다.테이블 반환 함수에서 반환 된 테이블과 조인 할 수없는 이유는 무엇입니까?

SQL Server가 TVF의 반환 값과의 조인을 허용하지 않는 이유가 궁금합니다. 특히 TVF에서 CROSS APPLY을 임시 테이블과 내부 결합하는 것과 다른 점은 무엇입니까? SQL Server가 TVF의 반환 테이블과 임시 테이블을 정의하는 방법에 차이가 있습니까?

+1

내부 조인을 사용하면 두 테이블 모두 전체적으로 안정적입니다. 'apply'를 사용하면 오른쪽의 테이블 표현식의 내용이 왼쪽의 각 행마다 바뀔 수 있습니다. –

+0

우리가하려고했던 것에 대한 짧은 코드 샘플을 가지고 있다면, 우리는 더 나은 대답을 구성 할 수 있습니다. –

+0

@MartinSmith 그 대답은 아주 좋은 의미입니다. – rookie

답변

0

는 다음과 같은 고려 :

SELECT * 
FROM tblFoo 
INNER JOIN (fnGetTable(tblFoo.someValue) 

fnGetTabletblFoo.someValue의 각 값을 새 테이블을 반환합니다. 그래서 하나의 테이블에 합류하기보다는 많은 사람들과 합류하고 있습니다.

궁극적으로 이것은 임시 테이블과 db 테이블이 상수 개체라는 것과 관련이 있다고 생각합니다. 테이블 반환 함수는 매번 동일한 테이블 개체를 반환하지 않습니다.

3

임시 테이블을 사용하여 내부 결합과 다른 TVF에서 CROSS APPLY를 수행하는 방법은 무엇입니까?

당신은 TVF에 가입 할 수 있습니다,하지만 당신은 TVF 호출 내에서 결합 테이블에서 열을 사용할 수 없습니다 문자열에 테이블 반환 함수 테이블을 만들고 여기에

DECLARE @directions VARCHAR(MAX) = 'N, S, W, E' 

SELECT a.StreetName, s.Value 
FROM dbo.Address a 
JOIN dbo.SplitByToken(@directions, ',') s ON a.Direction = s.Value 

을 기반으로 - 토큰으로 구분 된 목록. 이 쿼리는 테이블 함수의 결과가 알려져 있고 조인 테이블의 결과마다 변경되지 않으므로 문제가 발생하지 않습니다. 한 번 실행되고 결과 테이블은 Address에 결합됩니다.

join 대신 cross apply을 사용해야한다는 것은 TVF를 조인 테이블의 열과 함께 사용하는 경우입니다. 여기

SELECT a.ZIP, g.Long, g.Lat 
FROM dbo.Address a 
CROSS APPLY dbo.GeoLocation(a.ZIP) g 

지리적 위치

우리가 계산시에 사용하는 테이블에 기초하여 계산하고, 기능 번 Address 테이블의 행마다 호출되어야한다.

관련 문제