SQLServer APPLY 표 연산 자 사용 안내

3770 단어 APPLY표 연산 자
새로 추 가 된 APPLY 표 연산 자 는 왼쪽 표 표현 식 의 모든 줄 에 오른쪽 표 표현 식 을 적용 합 니 다.JOIN 처럼 그 표현 식 을 먼저 계산 해도 되 는 것 이 아니 라 APPLY 는 왼쪽 표현 식 을 먼저 논리 적 으로 계산 해 야 합 니 다.이 계산 입력 의 논리 적 순 서 를 허용 합 니 다.오른쪽 표현 식 은 왼쪽 표 표현 식 과 연 결 됩 니 다.
APPLY 는 두 가지 형식 이 있 는데 하 나 는 OUTER APPLY 이 고 하 나 는 CROSS APPLY 이다.차이 점 은 OUTER 를 지정 하 는 것 이다.결 과 는 오른쪽 표 표현 식 을 비 운 왼쪽 표 표현 식 의 줄 을 집중 적 으로 포함 하고 CROSS 를 지정 하 는 반면 결 과 는 오른쪽 표 표현 식 을 비 운 왼쪽 표 표현 식 의 줄 을 집중 적 으로 포함 하지 않 는 다 는 것 을 의미한다.
이것 을 몇 가지 예 로 해석 하면 더욱 분명 해 질 것 이다.
예 1:CROSS APPLY 형식
예 를 들 어 Large Table 표 의 한 열 에 저 장 된 데 이 터 는':'번호 로 구 분 된 데이터 입 니 다.우리 가 처리 할 때 이 값 을 먼저 구분 한 다음 에 구 분 된 모든 값 을 한 장의 표 에 따로 놓 은 다음 에 이 표를 처리 해 야 할 수도 있 습 니 다.
원본 데이터(큰 테이블 테이블 테이블):
간단 하기 위해 서,우 리 는 먼저 그 중의 id=2 줄 을 가지 고 처리 합 니 다.이것 은:번호 로 구 분 된 데이터 입 니 다.아마도 우리 의 특정한 표 의 메 인 키(t1)일 것 입 니 다.우 리 는 이 수 치 를 꺼 내 임시 표 에 넣 고,t1 표 와 관련 하여 처리 해 야 할 것 입 니 다.
이 분 리 된 데 이 터 를 처리 한 결 과 는 다음 그림 과 같 습 니 다.
  
이전 버 전 으로 이 조작 을 처리 하면 복잡 할 것 같 습 니 다.어떻게 처리 해 야 할 지 잠시 생각 하지 못 했 습 니 다.누 군가 이 루어 졌 다 면 힌트 를 주 셔 도 됩 니 다.
이것 은 그 중의 한 줄 로 만 처리 하 는 것 입 니 다.만약 에 우리 가 위의 그림 의 세 줄 로 모두 이렇게 처리 하면 세 줄 을 번호 로 구 분 된 수 치 를 한 표 에 넣 으 면 어떻게 처리 해 야 합 니까?
오늘 의 주인공 애플 리 가 깜짝 등장 한다.APPLY 표 연산 자 한 줄 문 구 를 사용 하면 상기 조작 을 처리 할 수 있다.
 
SELECT a FROM dbo.LargeTable AS LT --
CROSS APPLY dbo.split(LT.Name,':') -- , , ,
WHERE a <> '' -- a
처리 결 과 는 다음 과 같다.
  
쉽 지?     추가 정의 가 필요 한 것 은 바로 그 사용자 정의 표 값 함수(split)입 니 다.이것 은 제 가 인터넷 에서 찾 은 것 입 니 다.Net 에서 Split 작업 과 유사 합 니 다.코드 는 다음 과 같 습 니 다.
 
/*
:SELECT * FROM dbo.split('581::579::519::279::406::361::560',':')
*/
ALTER Function [dbo].[Split](@Sql varchar(8000),@Splits varchar(10))
returns @temp Table (a varchar(100))
As
Begin
Declare @i Int
Set @Sql = RTrim(LTrim(@Sql))
Set @i = CharIndex(@Splits,@Sql)
While @i >= 1
Begin
Insert @temp Values(Left(@Sql,@i-1))
Set @Sql = SubString(@Sql,@i+1,Len(@Sql)-@i)
Set @i = CharIndex(@Splits,@Sql)
End
If @Sql <> ''
Insert @temp Values (@Sql)
Return
End
예 2:OUTER APPLY 형식 입 니 다.
장면:공급 업 체 표(Supplier)와 공급 업 체 제품 표(Products)가 있 습 니 다.우 리 는 모든 공급 업 체 중에서 단가 가 가장 높 은 두 제품 을 찾 아야 합 니 다.
공급 업 체 표:
  
공급 업 체 제품 표:
  
우선,사용자 정의 테이블 값 함수(dbo.fntop_products),이 함 수 는 공급 업 체 ID 에 따라 단가 가 가장 높 은 두 상품 을 되 돌려 줍 니 다.
 
IF OBJECT_ID('dbo.fn_top_products') IS NOT NULL
DROP FUNCTION dbo.fn_top_products;
GO
-- ID
CREATE FUNCTION dbo.fn_top_products
(@supid AS INT)
RETURNS TABLE
AS
RETURN
SELECT TOP(2)Id AS ProductId,ProductName,UnitPrice
FROM dbo.Products
WHERE SupplierId = @supid
ORDER BY UnitPrice DESC
GO
자,전기 데이터 가 모두 준비 되 었 습 니 다.다음은 OUTER APPLY 형식 으로 어떤 결과 가 나 올 지 알 아 보 겠 습 니 다.다음 문장 을 실행 합 니 다:
 
SELECT S.id AS SupplierId,S.CompanyName,UnitPrice FROM dbo.Supplier AS S
OUTER APPLY dbo.fn_top_products(S.id) AS P
실행 결 과 는 다음 과 같 습 니 다.
   
마지막 으로 NULL 의 기록 에 주의 하 세 요.reed 회 사 는 상품 이 없어 서 단가 가 NULL 입 니 다.
CROSS APPLY 형식 으로 다음 과 같은 조 회 를 수행 합 니 다.
 
SELECT S.id AS SupplierId,S.CompanyName,UnitPrice FROM dbo.Supplier AS S
CROSS APPLY dbo.fn_top_products(S.id) AS P 
생 성 된 출력 결 과 는 다음 과 같 습 니 다.
     
OUTER APPLY 와 CROSS APPLY 의 차이 점 을 보 셨 죠?
APPLY 의 실행 과정 을 다시 한 번 말씀 드 리 겠 습 니 다.왼쪽 표 표현 식(이상 의 Large Table 표)을 논리 적 으로 계산 한 다음 오른쪽 표현 식(이상 의 사용자 정의 표 값 함수 Split)을 왼쪽 표 표현 식 의 모든 줄 에 적용 합 니 다.실제 적 으로 외부 조회 의 열 인용 을 매개 변수 로 표 값 함수 에 전달 합 니 다.

좋은 웹페이지 즐겨찾기