그만큼 공통 테이블 표현식(CTE) 파생 테이블이 적합하지 않은 다양한 클래스의 SQL 쿼리를 단순화하기 위해 표준 SQL에 도입되었습니다. CTE는 SQL Server 2005에 도입되었으며 CTE(공통 테이블 식)는 테이블 내에서 참조할 수 있는 임시 명명된 결과 집합입니다. 선택하다 , 끼워 넣다 , 업데이트 , 또는 삭제 성명. 뷰의 SELECT 쿼리의 일부로 CREATE 뷰에서 CTE를 사용할 수도 있습니다. 또한 SQL Server 2008부터 새 MERGE 문에 CTE를 추가할 수 있습니다.
SQL Server에 CTE가 필요한 이유는 무엇입니까?
공통 테이블 [더 이상 사용되지 않음]CTE는 강력한 SQL 쿼리를 단순화하는 데 도움이 되는 구성입니다. CTE는 쿼리 실행 중에 생성되고 쿼리에 사용되며 쿼리 실행 후 삭제되는 가상 테이블(레코드 및 열 포함) 역할을 합니다.
CTE 사용
SELECT, INSERT, UPDATE, DELETE 또는 MERGE 문 바로 앞에 WITH 절을 추가하여 CTE를 정의할 수 있습니다. WITH 절에는 쉼표로 구분된 하나 이상의 CTE가 포함될 수 있습니다.
자바의 기본 데이터 유형
통사론:
[와 함께 [, …]]
::=
cte_name [(열_이름 [, …])]
AS(cte_query)
논쟁
- 표현식 이름: 공통 테이블 표현식의 유효한 식별자입니다. 표현식_이름은 동일한 WITH 절에 정의된 다른 공통 테이블 표현식의 이름과 달라야 하지만, 표현식_이름은 기본 테이블 또는 뷰의 이름과 동일할 수 있습니다. 쿼리에서 표현식_이름에 대한 모든 참조는 기본 개체 대신 공통 테이블 표현식을 사용합니다.
- 열 이름: 공통 테이블 표현식에 열 이름을 지정합니다. 단일 CTE 정의 내에서 중복된 이름은 허용되지 않습니다. 열 이름의 수는 CTE_query_definition의 결과 집합에 있는 열 수와 일치해야 합니다. 열 이름 목록은 쿼리 정의의 결과 열이 모두 다른 이름을 갖는 경우에만 선택 사항입니다.
- CTE_QueryDefinition: 결과 집합이 공통 테이블 표현식을 충족하는 SELECT 문을 지정합니다. CTE_query_defining에 대한 SELECT 문은 CTE가 다른 CTE를 정의할 수 없다는 점을 제외하고 뷰 생성과 동일한 요구 사항을 충족해야 합니다. 자세한 내용은 설명 섹션과 CREATE VIEW(Transact-SQL)를 참조하세요. 여러 CTE_query_settings가 정의된 경우 쿼리 정의는 집합 연산자 UNION ALL, UNION, EXCEPT 또는 INTERSECT 중 하나와 결합되어야 합니다.
재귀 공통 테이블 표현식 정의 및 사용 규칙
재귀 공통 테이블 표현식 정의에는 다음 지침이 적용됩니다.
리눅스 실행 cmd
- 재귀 CTE 정의에는 앵커 멤버와 재귀 멤버라는 두 개 이상의 CTE 쿼리 정의가 포함되어야 합니다. 여러 앵커 및 재귀 멤버를 정의할 수 있습니다. 그러나 모든 앵커 멤버 쿼리 정의는 첫 번째 재귀 멤버 정의 앞에 배치되어야 합니다. 모든 CTE 쿼리 정의는 CTE 자체를 참조하지 않는 한 앵커 멤버입니다.
- 앵커 요소는 UNION ALL, UNION, INTERSECT, EXCEPT 집합 연산자 중 하나와 결합되어야 합니다. UNION ALL은 여러 재귀 멤버를 조인할 때 마지막 앵커 멤버와 첫 번째 재귀 멤버 사이의 유일한 유효한 집합 연산자입니다. 앵커 및 재귀 요소에는 동일한 수의 열이 있어야 합니다.
- 재귀 멤버 열의 데이터 형식은 앵커 멤버의 해당 열 데이터 형식과 동일해야 합니다.
- 재귀 멤버에 대한 CTE_query_definition에는 다음 항목이 허용되지 않습니다.
Please choose a different grouping PIVOT (For database compatibility level 110 and above. See Breaking Changes to Database Engine Features in SQL Server 2016. Offal Scalar aggregation Up LEFT, RIGHT, OUTER JOIN (INNER JOIN is allowed) subquery A hint applied to recursive references to CTEs within a CTE_query_definition.>
재귀 공통 테이블 표현식 생성
재귀 CTE는 해당 CTE 내에서 자신을 참조하는 CTE입니다. 재귀적 CTE는 쿼리가 전체 계층을 반환할 때까지 계속 실행되므로 계층적 데이터로 작업할 때 유용합니다.
계층적 데이터의 일반적인 예는 직원 목록이 포함된 테이블입니다. 모든 직원에 대해 테이블에는 해당 직원의 관리자에 대한 참조가 제공됩니다. 해당 참조 자체는 동일한 테이블 내의 직원 ID입니다. 재귀적 CTE를 사용하여 직원 데이터의 계층 구조를 표시할 수 있습니다.
포스트그레스의 직렬
CTE가 잘못 생성되면 무한 루프에 들어갈 수 있습니다. 이를 방지하기 위해 기본 SELECT, INSERT, UPDATE, DELETE 또는 MERGE 문의 OPTION 절에 MAXRECURSION 힌트를 추가할 수 있습니다.
테이블이 생성됩니다.
CREATE TABLE Employees ( EmployeeID int NOT NULL PRIMARY KEY, FirstName varchar(50) NOT NULL, LastName varchar(50) NOT NULL, ManagerID int NULL ) INSERT INTO Employees VALUES (1, 'Ken', 'Thompson', NULL) INSERT INTO Employees VALUES (2, 'Terri', 'Ryan', 1) INSERT INTO Employees VALUES (3, 'Robert', 'Durello', 1) INSERT INTO Employees VALUES (4, 'Rob', 'Bailey', 2) INSERT INTO Employees VALUES (5, 'Kent', 'Erickson', 2) INSERT INTO Employees VALUES (6, 'Bill', 'Goldberg', 3) INSERT INTO Employees VALUES (7, 'Ryan', 'Miller', 3) INSERT INTO Employees VALUES (8, 'Dane', 'Mark', 5) INSERT INTO Employees VALUES (9, 'Charles', 'Matthew', 6) INSERT INTO Employees VALUES (10, 'Michael', 'Jhonson', 6)>
Employees 테이블이 생성된 후 cteReports라는 CTE를 포함하는 WITH 절이 앞에 오는 다음 SELECT 문이 생성됩니다.
WITH cteReports (EmpID, FirstName, LastName, MgrID, EmpLevel) AS ( SELECT EmployeeID, FirstName, LastName, ManagerID, 1 FROM Employees WHERE ManagerID IS NULL UNION ALL SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID, r.EmpLevel + 1 FROM Employees e INNER JOIN cteReports r ON e.ManagerID = r.EmpID ) SELECT FirstName + ' ' + LastName AS FullName, EmpLevel, (SELECT FirstName + ' ' + LastName FROM Employees WHERE EmployeeID = cteReports.MgrID) AS Manager FROM cteReports ORDER BY EmpLevel, MgrID>
따라서 CTE는 SELECT, INSERT, UPDATE, DELETE 또는 MERGE 문에서 액세스할 수 있는 임시 결과 집합을 생성해야 할 때 유용할 수 있습니다.
Azure 공통 테이블 식의 기능 및 제한 사항
Azure Synapse Analytics 및 PDW(분석 플랫폼 시스템)의 현재 CTE 구현에는 다음과 같은 기능과 제한 사항이 있습니다.
- CTE는 SELECT 문에서만 지정할 수 있습니다.
- CTE는 CREATE VIEW 문에서만 지정할 수 있습니다.
- CTE는 CREATE TABLE AS SELECT(CTAS) 문에서만 지정할 수 있습니다.
- CTE는 CREATE REMOTE TABLE AS SELECT(CRTAS) 문에서만 지정할 수 있습니다.
- CTE는 CREATE EXTERNAL TABLE AS SELECT(CETAS) 문에서만 지정할 수 있습니다.