PL/SQL With clause

The WITH clause in Oracle PL/SQL, also known as a Common Table Expression (CTE), is a powerful feature that allows you to define a temporary result set within the scope of a single SQL statement. It enhances the readability and maintainability of complex SQL queries by breaking them into modular, named subqueries.

Here’s a breakdown of the WITH clause and how it is typically used:


WITH cte_name (column_name1, column_name2, ...) AS (
    SELECT column_name1, column_name2, ...
    FROM table_name
    WHERE condition
FROM cte_name;


WITH EmployeeCTE AS (
    SELECT EmployeeID, FirstName, LastName
    FROM Employees
    WHERE Department = 'IT'
FROM EmployeeCTE;

In this example, EmployeeCTE is the name of the Common Table Expression. It selects employees from the Employees table who belong to the ‘IT’ department. The subsequent SELECT statement then retrieves data from the defined CTE.

Key Points:

Readability: The WITH clause improves the readability of complex queries by allowing you to break them into smaller, more manageable pieces.

Reusability: CTEs can be referenced multiple times in the main query, avoiding the need to duplicate complex subqueries.

Recursive Queries: The WITH clause supports recursive queries, which can be useful for hierarchical data structures.

Recursive Example

WITH RecursiveCTE (EmployeeID, ManagerID, Level) AS (
    SELECT EmployeeID, ManagerID, 1 AS Level
    FROM Employees
    SELECT e.EmployeeID, e.ManagerID, r.Level + 1
    FROM Employees e
    JOIN RecursiveCTE r ON e.ManagerID = r.EmployeeID
FROM RecursiveCTE;

In this recursive example, the CTE retrieves a hierarchical structure of employees and their managers.


The WITH clause in Oracle PL/SQL is a valuable tool for simplifying and organizing complex SQL queries. It enhances code readability, promotes reusability, and supports recursive queries for handling hierarchical data structures. Understanding and utilizing the WITH clause can greatly contribute to writing efficient and maintainable SQL code in Oracle databases.