Recursive CTE in Snowflake ❄️

DataGeeks
4 min readSep 21

Heard about CTE in SQL but didn’t hear about recursive CTE. The same was with me till last night when I was trying to solve an SQL problem. Don't worry this article is about the recursive CTE in Snowflake.

Let's understand what is CTE in SQL. CTE is an acronym for Common Table Expression in SQL, which provides a way to create temporary result sets within SQL queries.

Understanding Recursive CTEs

A recursive CTE is a special type of CTE used to work with hierarchical or tree-structured data within a relational database. Hierarchical data is data that is organized in a parent-child relationship, such as an organizational chart, file system structure, or product category hierarchy.

The recursive CTE allows you to perform operations on hierarchical data by repeatedly querying and joining a table with itself. This recursion continues until a specified condition is met, such as reaching the root node or a specific depth in the hierarchy.

The Snowflake Database

Before we dive into a real-world use case of Snowflake Recursive CTE, let’s briefly introduce Snowflake, a cloud-based data warehousing platform. Snowflake is known for its scalability, flexibility, and performance, making it a popular choice for data professionals. It supports ANSI SQL and offers various advanced features, including support for recursive CTEs.

Use Case: Organizational Hierarchy

Imagine you are working with a large organization’s employee data stored in a Snowflake database. The employee data is organized hierarchically, with each employee having a manager who, in turn, reports to another manager. Your task is to retrieve the reporting chain for a specific employee, starting from the employee and going up to the CEO of the company.

This is a classic use case for a Snowflake Recursive CTE. Here’s how you can use it to solve this problem:

First, let’s prepare an employee table and a few records for our use case.

CREATE DATABASE IF NOT EXISTS DS_EMPLOYEE;
CREATE OR REPLACE TABLE DS_EMPLOYEE.PUBLIC.EMPLOYEE
(
EMPLOYEE_NAME VARCHAR,
MANAGER_NAME VARCHAR
);

INSERT INTO DS_EMPLOYEE.PUBLIC.EMPLOYEE
VALUES…
DataGeeks

A data couple, Having 15 years of combined experience in data and love to share the knowledge about Data