SQL 2005 메모 공용 표 표현 식 학습(CTE)

공용 표 표현 식(CTE)은 하나의 SELECT,INSERT,UPDATE,DELETE 또는 CREATE VIEW 문장의 실행 범위 내 에서 정 의 된 임시 결과 집합 이 라 고 볼 수 있다.CTE 는 파생 표 와 유사 하 며 구체 적 으로 저장 되 지 않 은 대상 에 나타 나 며 조회 기간 에 만 유효 합 니 다.파생 표 와 다른 점 은 CTE 가 스스로 인용 할 수 있 고 같은 조회 에서 여러 번 인용 할 수 있다 는 점 이다.CTE 는:1.재 귀적 조회(저 는 개인 적 으로 CTE 가 가장 좋다 고 생각 하 는 곳)를 만 드 는 데 사용 할 수 있 습 니 다.2.같은 문장에서 생 성 된 표 CTE 의 장점 을 여러 번 참조 합 니 다.CTE 를 사용 하면 가 독성 을 향상 시 키 고 복잡 한 조 회 를 쉽게 유지 할 수 있다 는 장점 을 얻 을 수 있 습 니 다.조 회 는 단독 블록,단순 블록,논리 적 생 성 블록 으로 나 눌 수 있다.이후 이 간단 한 블록 들 은 최종 결과 집합 이 생 성 될 때 까지 더 복잡 한 임시 CTE 를 만 드 는 데 사용 된다.CTE 사용 가능 한 범위:사용자 가 정의 하 는 루틴(예 를 들 어 함수,저장 과정,트리거 또는 보기)에서 CTE 를 정의 할 수 있 습 니 다.다음은 간단 한 CTE 예제 입 니 다.test 표 에서 salary 의 가장 큰 id 기록 을 test 에 저장 합 니 다.CTE 에서 재 호출
 
with test_CTE(id,salary)
as
(
select id ,max(salary)
from test
group by id
)
select * from test_cte
상기 예제 에서 알 수 있 듯 이 CTE 는 CTE 를 나타 내 는 표현 식 이름,선택 가능 한 목록 과 CET 를 정의 하 는 조회 로 구성 된다.CTE 를 정의 하면 SELECT,INSERT,UPDATE 또는 DELETE 문구 에서 인용 표 나 보기 처럼 인용 할 수 있 습 니 다.쉽게 말 하면 CTE 는 임시 표 와 표 변수의 기능 을 대체 할 수 있다.저 는 개인 적 으로 cte 가 가장 좋 은 곳 은 재 귀 조 회 를 만 드 는 것 이 라 고 생각 합 니 다.다음은 이 기능 을 보 여 드 리 겠 습 니 다.기 존의 데이터 구 조 는 다음 과 같 습 니 다.이 데 이 터 는 표 Co 에 저 장 됩 니 다.ItemNameset 에서 표 구조 와 일부 데 이 터 는 다음 과 같다.ItemId Parent ItemId ItemName 2 0 관리 비용 30 판매 비용 40 재무 비용 50 생산 원가 35 5 재료 36 5 인공 37 5 제조 비용 38 35 원자재 39 35 주요 재료 40 35 간 부재료 41 36 급여 42 36 복지 43 36 년 보너스 현재 수 요 는:ItemId=2 를 조회 하고 싶 습 니 다.즉,관리 비용 과 그 부하 모든 노드 의 정 보 는 CTE 를 통 해 필요 한 데 이 터 를 간단하게 달성 할 수 있 습 니 다.CTE 의 편의 성 을 나타 내기 위해 저 는 sql 2000 버 전의 해결 방법 도 썼 습 니 다.먼저 sql 2000 이 이 문 제 를 어떻게 해결 하 는 지 살 펴 보 자

--sql2000
DECLARE @i INT
SELECT @i=2;

/*
( )。
, 。
, 。
*/
CREATE TABLE #tem(
[ItemId] [INT] NOT NULL,
[level] INT
);

/*

*/
CREATE TABLE #list(
[ItemId] [INT] NOT NULL,
[ParentItemId] [INT] NOT NULL DEFAULT ((0)),
[ItemName] [nvarchar](100) NOT NULL DEFAULT (''),
[level] INT
);

INSERT INTO #tem([ItemId],[level])
SELECT ItemId, 1
FROM Co_ItemNameSet
WHERE itemid=@i

INSERT INTO #list([ItemId],[ParentItemId],[ItemName],[level])
SELECT ItemId, ParentItemId, ItemName ,1
FROM Co_ItemNameSet
WHERE itemid=@i

DECLARE @level INT
SELECT @level=1

DECLARE @current INT
SELECT @current=0

/*
@level 0 , :
1. (@level) , , @current。
2. , (@level + 1) 。
3. (IF @@ROWCOUNT > 0), (@level = @level + 1); , 。
4. , , , (@level = @level - 1)。 , 。
*/
WHILE(@level>0)
BEGIN
SELECT @current=ItemId
FROM #tem
WHERE [level]=@level

IF @@ROWCOUNT>0
BEGIN
--
DELETE FROM #tem
WHERE [level]=@level and ItemId=@current

-- (@level + 1) 。
INSERT INTO #tem([ItemId],[level])
SELECT [ItemId],@level+1
FROM Co_ItemNameSet
WHERE ParentItemId=@current

--
INSERT INTO #list([ItemId],[ParentItemId],[ItemName],[level])
SELECT [ItemId],[ParentItemId],[ItemName] ,@level+1
FROM Co_ItemNameSet
WHERE ParentItemId=@current

IF @@rowcount>0
BEGIN
SELECT @level=@level+1
END
END
ELSE
BEGIN
SELECT @level=@level-1
END
END

--
SELECT * FROM #list

DROP TABLE #tem
DROP TABLE #list
go
결 과 는 다음 과 같다.sql 2005 에서 CTE 의 재 귀 특징 을 통 해 2 단계 로 실현 할 수 있 습 니 다.같은 결 과 를 얻 었 습 니 다.sql 2005 의 CTE 코드 는 훨씬 간단 합 니 다.이것 이 바로 CTE 가 재 귀 조 회 를 지원 하 는 매력 입 니 다.아래 코드 를 보 세 요.

좋은 웹페이지 즐겨찾기