Recursive CTE concept in SQL - Time & Space Complexity
Recursive CTEs run queries repeatedly to build results step-by-step.
We want to know how the work grows as the recursion goes deeper.
Analyze the time complexity of the following recursive CTE.
WITH RECURSIVE Numbers AS (
SELECT 1 AS num
UNION ALL
SELECT num + 1 FROM Numbers WHERE num < 6
)
SELECT * FROM Numbers;
This query generates numbers from 1 to 6 by repeatedly adding 1.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: Recursive step that adds 1 to the number.
- How many times: Once per number from 1 up to 6 (6 times).
Each recursion adds one more number until the limit is reached.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 steps (including base) |
| 100 | About 100 steps |
| 1000 | About 1000 steps |
Pattern observation: The number of steps grows roughly the same as the input size.
Time Complexity: O(n)
This means the work grows linearly as the recursion depth increases.
[X] Wrong: "Recursive CTEs run in constant time regardless of input size."
[OK] Correct: Each recursive step adds work, so more input means more steps and more time.
Understanding recursive CTE time helps you explain how queries scale and shows you can reason about repeated work.
"What if the recursive step added two numbers each time instead of one? How would the time complexity change?"
Practice
Recursive CTE in SQL?Solution
Step 1: Understand Recursive CTE definition
A Recursive CTE runs a query repeatedly, starting from an anchor and then recursively processing related rows.Step 2: Identify its main use
This is mainly used to explore hierarchical or linked data stepwise, like organizational charts or folder trees.Final Answer:
To repeatedly execute a query to process hierarchical or linked data -> Option DQuick Check:
Recursive CTE = repeated query for linked data [OK]
- Confusing recursive CTE with simple temporary tables
- Thinking recursive CTEs optimize indexes
- Assuming recursive CTEs join unrelated tables
Solution
Step 1: Recall recursive CTE syntax
The standard syntax starts withWITH cte_name AS (anchor_query UNION ALL recursive_query).Step 2: Check options for correct form
WITH cte_name AS (SELECT ... UNION ALL SELECT ... FROM cte_name ...) correctly shows the anchor and recursive parts combined withUNION ALLand references the CTE name in the recursive part.Final Answer:
WITH cte_name AS (SELECT ... UNION ALL SELECT ... FROM cte_name ...) -> Option AQuick Check:
Recursive CTE syntax = WITH + UNION ALL + self-reference [OK]
- Using CREATE instead of WITH
- Omitting UNION ALL
- Not referencing the CTE name recursively
Employees(id, manager_id) and this recursive CTE:WITH RECURSIVE EmpCTE AS ( SELECT id, manager_id FROM Employees WHERE id = 1 UNION ALL SELECT e.id, e.manager_id FROM Employees e JOIN EmpCTE c ON e.manager_id = c.id ) SELECT id FROM EmpCTE ORDER BY id;
What does this query return?
Solution
Step 1: Analyze the anchor query
The anchor selects employee withid = 1.Step 2: Analyze the recursive part
The recursive part joins Employees wheremanager_idmatches theidfrom previous results, thus finding direct reports, then their reports, and so on.Final Answer:
All employees who report directly or indirectly to employee with id 1 -> Option BQuick Check:
Recursive CTE finds all subordinates under id 1 [OK]
- Thinking it returns only the anchor row
- Assuming it returns employees without managers
- Believing it returns all employees regardless of manager
WITH RECURSIVE Numbers AS ( SELECT 1 AS num UNION ALL SELECT num + 1 FROM Numbers WHERE num < 5 ) SELECT * FROM Numbers;
Solution
Step 1: Check anchor query
The anchor selects1 AS num, which is correct.Step 2: Check recursive part and termination
The recursive part adds 1 tonumand stops whennumreaches 5, so it has a termination condition.Final Answer:
Recursive CTE syntax is correct and will run successfully -> Option CQuick Check:
Anchor + recursive with termination = valid recursive CTE [OK]
- Confusing UNION and UNION ALL effects
- Missing termination condition causing infinite recursion
- Assuming anchor query is missing
Solution
Step 1: Understand factorial calculation
Factorial of n is product of all integers from 1 to n. We start with n=1, fact=1.Step 2: Check recursive step correctness
WITH RECURSIVE Fact(n, fact) AS ( SELECT 1, 1 UNION ALL SELECT n + 1, fact * (n + 1) FROM Fact WHERE n < 5 ) SELECT fact FROM Fact WHERE n = 5; correctly increments n by 1 and multiplies fact by (n+1), matching factorial definition up to 5.Step 3: Verify termination and final selection
It stops when n reaches 5 and selects fact at n=5, giving 120.Final Answer:
Option A correctly computes factorial of 5 using recursive CTE -> Option AQuick Check:
Factorial recursion: multiply by next number, stop at 5 [OK]
- Starting from 0 causing multiplication by zero
- Using UNION instead of UNION ALL
- Incorrect multiplication order in recursive step
Ready to prove it?
Pass the test and this pattern moves unknown
