T-SQL Tutorial

CTE in SQL Server


What is CTE in SQL Server?

In this article, we will learn about the CTE in SQL Server. CTE stands for common table expression. A CTE is a temporary named result set that you can reference within another SELECT, INSERT, UPDATE, or DELETE statement.

A CTE is similar to a view in that it is not stored as an object and lasts only for the duration of the query. A CTE is a temporary result set that's defined within the execution scope of a single statement. In other words, a CTE is like a view, except that it's only available for the duration of the query.

By pure definition, a CTE is a temporary named result set. In practice, a CTE is a result set that remains in memory for the scope of a single execution of a SELECT, INSERT, UPDATE, DELETE, or MERGEstatement.

A CTE allows you to define a temporary named result set that available temporarily in the execution scope of a statement. CTEs can be used to simplify complex queries by breaking them down into smaller, more manageable pieces. For example, let's say you have a query that retrieves data from three different tables.

With a CTE, you can define each table as its own CTE and then reference those CTES in your main query. This can make your code more readable and easier to maintain. There are two ways to create a CTE in SQL Server: using the WITH clause or using CREATE TABLE. The WITH clause is the simpler of the two methods and is the recommended way to create CTEs.

CTEs can be used to

Simplify complex queries.
Improve performance by pre-computing intermediate results.
Create recursive queries (queries that reference themselves).

Features and Limitations of CTE

A CTE must be followed by a single statement(SELECT, INSERT, UPDATE, DELETE).
Multiple CTE query definitions can be defined in a CTE.
A CTE can reference itself and previously defined CTEs in the same WITH clause.

The following clauses cannot be used in the CTE query definition:
ORDER BY (except when a TOP clause is specified)
INTO
OPTION clause with query hints
FOR BROWSE

Syntax for Common Table Expressions

WITH expression_name[(column_name [,...])]
AS
(Define_CTE_query)
SQL_CTE_statement;

Simple CTE example

WITH CTE_ContractsTotals AS (
SELECT distinct CUSTOMER_ID,
SUM(AMOUNT) OVER (ORDER BY CUSTOMER_ID) AS TotalAmount
FROM contracts
)
SELECT * FROM CTE_ContractsTotals;

CTE example to limit counts and report averages

WITH Contracts_CTE (CtrCustomerID, NumberOfContracts)
AS
(
SELECT CUSTOMER_ID, COUNT(*)
FROM contracts
GROUP BY CUSTOMER_ID
)
SELECT AVG(NumberOfContracts) AS "Average"
FROM Contracts_CTE;

Multiple CTE definitions in a single query

WITH RegisterCTE (course_id, course_name, price, student_id)
AS (
select c.id, c.name, c.price, rc.student_id
from courses c, register_course rc
where c.id=rc.course_id
),
StudentCTE (id, name)
AS
(
SELECT s.id, s.name
FROM students s
)
SELECT x.student_id, y.name, x.course_name, x.price
FROM RegisterCTE x
JOIN StudentCTE y ON x.student_id = y.id
order by x.student_id;





The Benefits of Using a CTE

There are many benefits to using a CTE in SQL Server. Perhaps the most obvious benefit is that it can make your code more readable and easier to follow. When you use a CTE, you are essentially creating a temporary named result set that you can then reference later in your query. This means that you can break up your query into smaller, more manageable pieces.

Another benefit of using a CTE is that it can improve performance. This is because when you reference a CTE in your query, the optimizer can sometimes recognize this and generate a more efficient execution plan. In some cases, using a CTE can even allow you to avoid using a subquery altogether.

CTEs can be used to encapsulate reusable code. If you find yourself writing similar queries over and over again, you can create a CTE once and then reference it whenever you need it.