SQL 키워드 WITH AS 픽업

4830 단어 with
댓 글
WITH AS 의 의미     WITH AS 구문 은 하위 조회 부분 (subquery factoring) 이 라 고도 합 니 다. 많은 일 을 할 수 있 고 SQL 세 션 을 정의 할 수 있 습 니 다. 이 SQL 세 션 은 전체 SQL 구문 에 사 용 됩 니 다.때로는 SQL 문장의 가 독성 을 높이 기 위해 서 일 수도 있 고, UNION ALL 의 다른 부분 에서 데 이 터 를 제공 하 는 부분 일 수도 있다. 특히 유 니 온 올 에 게 유용 하 다.UNION ALL 은 파 트 마다 동일 할 수 있 지만 파 트 마다 한번 씩 실행 하면 비용 이 너무 많이 들 기 때문에 WITH AS 구 를 사용 할 수 있 고 한번 만 실행 하면 된다.WITH AS 구문 이 정의 하 는 표 이름 이 두 번 이상 호출 되면, 최적화 기 는 WITH AS 구문 에서 얻 은 데 이 터 를 하나의 TEMP 표 에 자동 으로 넣 고, 한 번 호출 된 경우 에는 그렇지 않 습 니 다.힌트 materialize 는 WITH AS 구문 의 데 이 터 를 전체 임시 표 에 강제로 넣 는 것 입 니 다.많은 조 회 는 이런 방법 을 통 해 속 도 를 높 일 수 있다.2. 사용 방법 은 다음 에 포 함 된 검색 어 를 먼저 봅 니 다.
select * from person.StateProvince where CountryRegionCode in          (select CountryRegionCode from person.CountryRegion where Name like 'C%')
    위의 검색 어 는 하위 검색 어 를 사용 했다.이 SQL 문 구 는 복잡 하지 않 지만 포 함 된 차원 이 너무 많 으 면 SQL 문 구 를 읽 고 유지 하기 가 매우 어 려 울 것 입 니 다.따라서 표 변수의 방식 으로 이 문 제 를 해결 할 수 있 습 니 다. SQL 문 구 는 다음 과 같 습 니 다.
declare @t table(CountryRegionCode nvarchar(3))insert into @t(CountryRegionCode)  (select CountryRegionCode from person.CountryRegion where Name like 'C%')
select * from person.StateProvince where CountryRegionCode                      in (select * from @t)
    위의 SQL 문 구 는 첫 번 째 방식 보다 더 복잡 하지만 하위 조 회 를 표 변수 @ t 에 두 었 습 니 다. 이렇게 하면 SQL 문 구 를 쉽게 유지 할 수 있 지만 또 다른 문 제 를 가 져 올 수 있 습 니 다. 바로 성능 의 손실 입 니 다.표 변 수 는 실제 적 으로 임시 표를 사용 하여 추가 적 인 I / O 비용 을 증가 시 켰 기 때문에 표 변 수 는 데이터 양 이 많 고 자주 조회 하 는 상황 에 적합 하지 않다.이 를 위해 SQL Server 2005 에서 또 다른 해결 방안 을 제 공 했 습 니 다. 이것 이 바로 공용 표 표현 식 (CTE) 입 니 다. CTE 를 사용 하면 SQL 문 구 를 유지 할 수 있 고 CTE 는 표 변수 보다 훨씬 효율 적 입 니 다.
    다음은 CTE 의 문법 입 니 다.
[ WITH [ ,n ] ]::=        expression_name [ ( column_name [ ,n ] ) ]    AS        ( CTE_query_definition )
    현재 CTE 를 사용 하여 위의 문 제 를 해결 합 니 다. SQL 문 구 는 다음 과 같 습 니 다.
 
withcr as(    select CountryRegionCode from person.CountryRegion where Name like 'C%')
select * from person.StateProvince where CountryRegionCode in (select * from cr)
    그 중에서 cr 은 공용 표 표현 식 입 니 다. 이 표현 식 은 사용 에 있어 서 표 변수 와 유사 합 니 다. 다만 SQL Server 2005 는 공용 표 표현 식 을 처리 하 는 방식 이 다 릅 니 다.
    CTE 를 사용 할 때 다음 과 같은 몇 가 지 를 주의해 야 합 니 다. 1. CTE 뒤에 CTE 를 사용 하 는 SQL 문 구 를 직접 따라 가 야 합 니 다 (예 를 들 어 select, insert, update 등). 그렇지 않 으 면 CTE 는 효력 을 잃 습 니 다.아래 의 SQL 문 구 는 CTE 를 정상적으로 사용 할 수 없습니다:
withcr as(    select CountryRegionCode from person.CountryRegion where Name like 'C%')select * from person.CountryRegion  -- 이 SQL 문 구 를 제거 해 야 합 니 다 -- CTE 를 사용 하 는 SQL 문 구 는 관련 CTE 뒤에 바짝 붙 어야 합 니 다 -- select * from person. StateProvince where Country RegionCode in (select * from cr)
2. CTE 뒤에 도 다른 CTE 와 함께 사용 할 수 있 지만 하나의 with 만 사용 할 수 있 습 니 다. 여러 개의 CTE 중간 에 쉼표 (,) 로 구 분 됩 니 다. 아래 SQL 문 구 를 참조 하 십시오.
 
withcte1 as(    select * from table1 where name like 'abc%'),cte2 as(    select * from table2 where id > 20),cte3 as(    select * from table3 where price < 100)select a.* from cte1 a, cte2 b, cte3 c where a.id = b.id and a.id = c.id
3. CTE 의 표현 식 이름 이 특정한 데이터 시트 나 보기 와 이름 을 바 꾸 면 이 CTE 뒤에 있 는 SQL 문 구 는 여전히 CTE 를 사용 합 니 다. 물론 뒤의 SQL 문 구 는 데이터 시트 나 보 기 를 사용 합 니 다. 아래 의 SQL 문 구 를 참조 하 십시오.
--  table 1 은 실제 존재 하 는 표 입 니 다.
withtable1 as(    select * from persons where age < 30)select * from table1  --  table 1 이라는 공공 표 표현 식 select * from table 1 을 사 용 했 습 니 다.  --  table 1 이라는 데이터 시트 를 사 용 했 습 니 다.
4. CTE 는 자신 을 인용 할 수도 있 고 같은 WITH 자구 에서 미리 정 의 된 CTE 를 인용 할 수도 있다.전방 향 인용 을 허용 하지 않 습 니 다.
5. CTE 에서query_definition 에서 다음 절 을 사용 합 니 다:
(1) COMPUTE 또는 COMPUTE BY
(2) ORDER BY (TOP 자 구 를 지정 하지 않 는 한)
(3)INTO
(4) 조회 알림 이 있 는 OPTION 자구
(5)FOR XML
(6)FOR BROWSE
6. CTE 를 일괄 처리 의 일부분 에 속 하 는 구문 에 사용 하려 면 이전 문 구 는 다음 SQL 과 같이 분점 으로 끝내 야 합 니 다.
declare @s nvarchar(3)set @s = 'C%';  -- 점 수 를 더 해 야 합 니 다 withttree as(    select CountryRegionCode from person.CountryRegion where Name like @s)select * from person.StateProvince where CountryRegionCode in (select * from t_tree)
with as 를 사용 하여 재 귀 완료:
With RootNodeCTE(Id,ParentId)   

As   

(   

Select Id,ParentId From Dept Where ParentId =0 

Union All   

Select Dept.Id,Dept.ParentId From RootNodeCTE   

Inner Join Dept  

On RootNodeCTE.Id = Dept.ParentId   

)   

  

Select * From RootNodeCTE  

--        

create table Dept(ID int,ParentID int,msg varchar(20))  

insert into Dept select 1,0,null  

insert into Dept select 2,1,null  

insert into Dept select 3,1,null  

insert into Dept select 4,2,null  

insert into Dept select 5,3,null  

insert into Dept select 6,5,null  

insert into Dept select 7,6,null  

--go

--DROP TABLE Dept


좋은 웹페이지 즐겨찾기