Open-Closed Principle

[MS-SQL]공통 테이블 식(CTE) 본문

Programming/MS-SQL

[MS-SQL]공통 테이블 식(CTE)

대박플머 2016. 2. 12. 09:00

공통 테이블 식(CTEs)은 파생 테이블과 비슷한 또 다른 형태의 기본 테이블 표현ㅅ기이다. 파생 테이블과 유사하지만, 파생 테이블보다는 더 많은 장점을 제공한다. 

CTE는 WITH 절을 이용해서 정의되며 다음과 같은 일반적인 형태를 따른다. 

1
2
3
4
5
WITH <CTE_이름>[(<대상 컬럼 목록>)]
AS (
     <CTE를 정의하느 내부 쿼리>
)
<CTE에 대한 외부 쿼리>;

cs

참고 : T-SQL에서 WITH 절은 다양한 방식으로 사용된다. 따라서 WITH 절이 CTE를 정의하기 위해서 사용된다고 명확하게 명시할 필요가 있다. 즉 WITH 절이 CTE를 정의할 때 사용되는 경우에는, 동일한 배치 내에서 WITH 절앞에 또는 다른 구문이 있다면 반드시 세미콜론을 표기해줘야 한다.


겉으로 보기에는 파생 테이블과 CTE 간에는 차이가 거의 없어 보일 수도 있다. 그러나 파생테이블과 비교했을 때, CTE를 정의해서 사용하는 방식이 중요한 장점들은 더 많이 제공하고 있다. 이러한 장점들 중 하나는 CTE를 다른 CTE에서 참조해야 할 때다. 파생 테이블에서는 중처시키는 것 말고는 이를 구현할 방법이 없다. CTE를 사용하면, 하나의 WITH 절 다음에 쉼표(,)로 구분된 여러 CTE를 정의할 수 있다. 각각의 CTE는 앞에 정의된 다른 CTE를 참조할 수 있으며, 외부 쿼리 또한 모든 CTE를 참조할 수 있다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
WITH 
C1 AS(
    Select Year(orderdate) As orderyear, custid
    From Sales.Orders
), 
C2 AS (
    Select orderyear, Count(DISTINCT custid) As numcusts
    From C1
    Group By orderyear
)
Select orderyear, numcusts
From C2
Where numcusts > 70;
 
cs

각각의 CTE는 몯ㄹ 방식으로 코드에서 분리된 형태를 띠고 있다. 이러한 모듈 단위의 처리 방식은 중첩된 파생 테이블을 사용하는 방식과 비교했을 때 코드의 가독성을 높여주며 유지 관리도 용이해진다. 

기술적으로 봤을 때에는 CTE를 중첩시킬 수는 없으며, 파생 테이블의 괄호 안에서 CTE를 정의할 수도 없다. 중첩은 분명 문제가 있는 방식이다. 따라서 이러한 제약사항은 코드를 문제가 있도록 만드는 대신 오히려 명확하게 해준다는 점에서 도움이 되는 요소라고 생각한다.

'Programming > MS-SQL' 카테고리의 다른 글

[MS-SQL] Comment 수정  (0) 2022.02.25
[MS-SQL] UNION 연산자  (0) 2016.02.16
[MS-SQL] DELETE JOIN  (0) 2016.02.04
[MS-SQL]데이터 삭제 DELETE vs TRUNCATE  (0) 2016.02.03
[MS-SQL]SELECT INTO 구문  (0) 2016.02.03