공통 테이블 표현식

공통 테이블 표현식은 뒤에 오는 fullselect의 FROM절에 테이블 이름으로 지정할 수 있는 table-name을 사용하여 결과 테이블을 정의할 수 있도록 허용합니다.

구문 다이어그램 읽기시각적 구문 다이어그램 건너뛰기 테이블 이름 (,컬럼 이름)1 AS ( fullselect )
참고:
  • 1 공통 테이블 표현식이 재귀적이거나 fullselect가 중복 컬럼 이름을 생성하는 경우, 컬럼 이름을 지정해야 합니다.

단일 WITH 키워드를 따라 다중 공통 테이블 표현식을 지정할 수 있습니다. 지정된 각 공통 테이블 표현식을 연속 공통 테이블 표현식의 FROM절에 있는 이름을 통해서도 참조할 수 있습니다.

컬럼 목록이 지정된 경우 fullselect의 결과 테이블에 있는 컬럼 수만큼 많은 이름으로 구성되어야 합니다. 각 column-name은 고유하고 규정되지 않아야 합니다. 이러한 컬럼 이름이 지정되지 않으면, 공통 테이블 표현식을 정의하는 데 사용되는 fullselect의 선택 목록에서 이름이 파생됩니다.

공통 테이블 표현식의 table-name은 동일한 명령문의 다른 공통 테이블 표현식 table-name과 달라야 합니다(SQLSTATE 42726). INSERT문에 공통 테이블 표현식이 지정된 경우에는 table-name이 삽입의 오브젝트인 테이블 또는 뷰 이름과 같을 수 없습니다(SQLSTATE 42726). 공통 테이블 표현식 table-name을 fullselect 전체에서 FROM절에 테이블 이름으로 지정할 수 있습니다. 공통 테이블 표현식의 table-name은 기존 테이블, 뷰 또는 별명(카탈로그의)을 동일한 규정 이름으로 겹쳐씁니다.

두 개 이상의 공통 테이블 표현식이 동일한 명령문에 정의된 경우 공통 테이블 표현식 간의 순환 참조가 허용됩니다(SQLSTATE 42835). dt1dt2를 참조하고 dt2dt1을 참조하도록 두 개의 공통 테이블 표현식 dt1dt2가 작성된 경우 순환 참조가 발생합니다.

공통 테이블 표현식의 fullselect가 FROM절에 data-change-table-reference를 포함하는 경우 공통 테이블 표현식은 데이터를 수정한다고 합니다. 데이터를 수정하는 공통 테이블 표현식은 명령문 어딘가에서 공통 테이블 표현식이 사용되는지 여부에 관계없이 명령문이 처리될 때 항상 평가됩니다. 데이터를 읽거나 수정하는 하나 이상의 공통 테이블 표현식이 있으면 모든 공통 테이블 표현식은 발생하는 순서로 처리되며, 데이터를 읽거나 수정하는 공통 테이블 표현식은 연속 공통 테이블 표현식이 실행되기 전에 모든 제한조건과 트리거를 포함하여 완전히 실행됩니다.

공통 테이블 표현식은 CREATE VIEW 및 INSERT문에서 fullselect에 대해 이전 선택사항이기도 합니다.

공통 테이블 표현식을 사용할 수 있는 상황은 다음과 같습니다.
  • 뷰 작성 방지를 위해(일반적인 뷰 사용이 필요하지 않고 위치 지정된 갱신 또는 삭제가 사용되지 않는 경우) 뷰 대신
  • 비결정이거나 외부 조치가 있는 스칼라 subselect 또는 함수에서 파생된 컬럼으로 그룹화를 가능하게 하기 위해
  • 필수 결과 테이블이 호스트 변수를 기반으로 하는 경우
  • 동일한 결과 테이블을 fullselect에서 공유해야 하는 경우
  • 재귀를 사용하여 결과가 파생되어야 하는 경우
  • 다중 SQL 데이터 변경 명령문을 쿼리 내에서 처리해야 하는 경우

공통 테이블 표현식의 fullselect가 FROM절에 자신에 대한 참조를 포함하는 경우 공통 테이블 표현식은 재귀 공통 테이블 표현식입니다. 재귀를 사용하는 쿼리는 부품표(BOM), 예약 시스템, 네트워크 계획과 같은 애플리케이션 지원 시 유용합니다.

재귀 공통 테이블 표현식은 다음에 해당해야 합니다.

  • 재귀 주기의 일부인 각 fullselect는 SELECT 또는 SELECT ALL로 시작해야 합니다. SELECT DISTINCT 사용은 허용되지 않습니다(SQLSTATE 42925). 또한 통합은 UNION ALL을 사용해야 합니다(SQLSTATE 42925).
  • 공통 테이블 표현식의 table-name 다음에 컬럼 이름을 지정해야 합니다(SQLSTATE 42908).
  • 첫 번째 통합의 첫 번째 fullselect(초기화 fullselect)는 FROM절에 공통 테이블 표현식의 컬럼에 대한 참조를 포함하지 않아야 합니다(SQLSTATE 42836).
  • 공통 테이블 표현식의 컬럼 이름이 반복 fullselect에 참조된 경우 컬럼의 데이터 유형, 길이 및 코드 페이지는 초기화 fullselect를 기반으로 판별됩니다. 반복 fullselect의 해당 컬럼은 초기화 fullselect를 기반으로 판별된 데이터 유형 및 길이와 동일한 데이터 유형 및 길이를 가져야 하며 코드 페이지가 일치해야 합니다(SQLSTATE 42825). 그러나 문자열 유형의 경우 두 데이터 유형의 길이가 다를 수 있습니다. 이 경우, 반복 fullselect의 컬럼은 초기화 fullselect에서 판별된 길이에 항상 지정 가능한 길이를 가져야 합니다.
  • 재귀 주기의 일부인 각 fullselect는 집계 함수, group by절 또는 having절을 포함하지 않아야 합니다(SQLSTATE 42836).

    이러한 fullselect의 FROM절은 재귀 주기의 일부인 공통 테이블 표현식에 대한 최대 하나의 참조를 포함할 수 있습니다(SQLSTATE 42836).

  • 반복 fullselect 및 전체 재귀 fullselect는 order by절을 포함하지 않아야 합니다(SQLSTATE 42836).
  • 서브쿼리(스칼라 또는 정량화)는 재귀 주기의 일부가 아니어야 합니다(SQLSTATE 42836).
재귀 공통 테이블 표현식 개발 시 무한 재귀 주기(루프)를 작성할 수 있음을 기억하십시오. 재귀 주기가 중지되는지 검사하십시오. 관련된 데이터가 순환인 경우 이는 특히 중요합니다. 재귀 공통 테이블 표현식은 무한 루프를 방지할 술어를 포함합니다. 재귀 공통 테이블 표현식은 다음을 포함합니다.
  • 반복 fullselect에서 상수로 중분된 정수 컬럼
  • "counter_col < constant" 또는 "counter _col < :hostvar" 양식의 반복 fullselect의 where절에 술어

재귀 공통 테이블 표현식에서 이 구문을 찾을 수 없으면 경고가 발행됩니다(SQLSTATE 01605).