A Recursive CTE (Common Table Expression) is a temporary result set that references itself to perform repeated operations, often used to generate sequences or traverse hierarchical data.
Click to reveal answer
beginner
How does a Recursive CTE generate a series of numbers?
It starts with an initial value (anchor member) and repeatedly adds rows by referencing itself (recursive member) until a stopping condition is met.
Click to reveal answer
beginner
What are the two main parts of a Recursive CTE?
1. Anchor member: the starting query that runs once. 2. Recursive member: the query that references the CTE itself to add more rows.
Click to reveal answer
beginner
Why do we need a stopping condition in a Recursive CTE?
To prevent infinite loops by telling SQL when to stop adding new rows in the recursion.
Click to reveal answer
intermediate
Write a simple Recursive CTE to generate numbers from 1 to 5.
WITH Numbers AS (
SELECT 1 AS num
UNION ALL
SELECT num + 1 FROM Numbers WHERE num < 5
)
SELECT num FROM Numbers;
Click to reveal answer
What does the anchor member in a Recursive CTE do?
AStarts the recursion with initial rows
BStops the recursion
CReferences the CTE itself
DDeletes rows from the table
✗ Incorrect
The anchor member provides the initial rows to start the recursion.
Which SQL keyword is used to combine the anchor and recursive members in a Recursive CTE?
AJOIN
BORDER BY
CGROUP BY
DUNION ALL
✗ Incorrect
UNION ALL combines the anchor and recursive queries to build the full result.
What happens if a Recursive CTE has no stopping condition?
AIt returns only the anchor member rows
BIt returns an empty result
CIt runs infinitely or until max recursion limit
DIt throws a syntax error
✗ Incorrect
Without a stopping condition, recursion continues until SQL server stops it or runs out of resources.
Which of these is a valid use case for Recursive CTEs?
ASorting a table alphabetically
BGenerating a list of dates
CUpdating multiple tables
DCreating indexes
✗ Incorrect
Recursive CTEs are great for generating sequences like dates or numbers.
In the example: WITH Numbers AS (SELECT 1 AS num UNION ALL SELECT num + 1 FROM Numbers WHERE num < 5), what is the last number generated?
A5
B1
C6
D4
✗ Incorrect
The recursion stops when num reaches 5, so 5 is the last number generated.
Explain how a Recursive CTE generates a series of numbers step-by-step.
Think about how the query calls itself repeatedly.
You got /4 concepts.
Describe why a stopping condition is important in Recursive CTEs and what might happen without it.
Consider what happens if the recursion never ends.
You got /3 concepts.
Practice
(1/5)
1. What is the main purpose of using a Recursive CTE in SQL for series generation?
easy
A. To generate a sequence of numbers or dates step-by-step within a query
B. To join two tables based on a common column
C. To delete duplicate rows from a table
D. To create indexes for faster searching
Solution
Step 1: Understand Recursive CTE usage
Recursive CTEs are used to repeatedly execute a query to build results step-by-step.
Step 2: Identify series generation purpose
They are commonly used to generate sequences like numbers or dates without needing extra tables.
Final Answer:
To generate a sequence of numbers or dates step-by-step within a query -> Option A
2. Which of the following is the correct syntax to start a recursive CTE named numbers generating numbers from 1?
easy
A. WITH RECURSIVE numbers AS SELECT 1 AS num UNION ALL SELECT num + 1 FROM numbers WHERE num < 5
B. WITH RECURSIVE numbers AS (SELECT 1 AS num UNION ALL SELECT num + 1 FROM numbers WHERE num < 5)
C. WITH numbers RECURSIVE AS (SELECT 1 AS num UNION ALL SELECT num + 1 FROM numbers WHERE num < 5)
D. WITH RECURSIVE numbers (num) AS (SELECT 1 AS n UNION ALL SELECT num + 1 FROM numbers WHERE num < 5)
Solution
Step 1: Check correct WITH RECURSIVE syntax
The correct syntax starts with WITH RECURSIVE cte_name AS ( ... ).
Step 2: Validate the recursive query structure
WITH RECURSIVE numbers AS (SELECT 1 AS num UNION ALL SELECT num + 1 FROM numbers WHERE num < 5) correctly uses SELECT 1 AS num as anchor and recursive part with UNION ALL and stopping condition.
Final Answer:
WITH RECURSIVE numbers AS (SELECT 1 AS num UNION ALL SELECT num + 1 FROM numbers WHERE num < 5) -> Option B
Quick Check:
Correct recursive CTE syntax = WITH RECURSIVE numbers AS (SELECT 1 AS num UNION ALL SELECT num + 1 FROM numbers WHERE num < 5) [OK]
Hint: Start recursive CTE with WITH RECURSIVE cte AS (...) [OK]
Common Mistakes:
Placing RECURSIVE after CTE name
Missing parentheses around CTE query
Omitting AS keyword
3. Given the query:
WITH RECURSIVE seq AS (
SELECT 1 AS n
UNION ALL
SELECT n + 2 FROM seq WHERE n < 7
)
SELECT * FROM seq;
What will be the output rows?
medium
A. [1, 3, 5]
B. [1, 2, 3, 4, 5, 6, 7]
C. [1, 3, 5, 7]
D. [2, 4, 6, 8]
Solution
Step 1: Analyze anchor and recursive step
Anchor row is 1. Recursive step adds 2 each time: 1, 3, 5, 7.
Step 2: Check stopping condition
Recursion stops when n < 7 is false. Since 7 is included, sequence ends at 7.
Final Answer:
[1, 3, 5, 7] -> Option C
Quick Check:
Start=1, step=+2, stop at 7 = [1,3,5,7] [OK]
Hint: Add step value repeatedly until condition fails [OK]
Common Mistakes:
Assuming step is 1 instead of 2
Stopping before reaching 7
Including numbers beyond 7
4. Identify the error in this recursive CTE:
WITH RECURSIVE count_up AS (
SELECT 1 AS num
UNION ALL
SELECT num + 1 FROM count_up
)
SELECT * FROM count_up WHERE num <= 3;
medium
A. Using UNION instead of UNION ALL
B. Incorrect anchor query syntax
C. Wrong column alias in SELECT statements
D. Missing stopping condition inside the recursive part causing infinite recursion
Solution
Step 1: Check recursive part for stopping condition
The recursive SELECT lacks a WHERE clause to stop recursion, causing infinite loop.
Step 2: Understand WHERE clause placement
The WHERE clause outside the CTE filters final results but does not stop recursion inside CTE.
Final Answer:
Missing stopping condition inside the recursive part causing infinite recursion -> Option D
Quick Check:
Stopping condition must be inside recursive CTE [OK]
Hint: Put stopping condition inside recursive SELECT, not outside [OK]
Common Mistakes:
Placing stopping condition only in final SELECT
Confusing UNION and UNION ALL effects
Incorrect alias usage
5. You want to generate a list of dates from '2024-01-01' to '2024-01-05' using a recursive CTE. Which query correctly produces this date series?
hard
A. WITH RECURSIVE dates AS (SELECT DATE('2024-01-01') AS dt UNION ALL SELECT dt + INTERVAL '1 day' FROM dates WHERE dt < '2024-01-05') SELECT * FROM dates;
B. WITH RECURSIVE dates AS (SELECT '2024-01-01' AS dt UNION ALL SELECT dt + INTERVAL 1 DAY FROM dates WHERE dt <= '2024-01-05') SELECT * FROM dates;
C. WITH RECURSIVE dates AS (SELECT '2024-01-01' AS dt UNION ALL SELECT dt + 1 FROM dates WHERE dt < '2024-01-05') SELECT * FROM dates;
D. WITH RECURSIVE dates AS (SELECT DATE('2024-01-01') AS dt UNION ALL SELECT DATE(dt, '+1 day') FROM dates WHERE dt < '2024-01-05') SELECT * FROM dates;
Solution
Step 1: Understand date addition syntax
WITH RECURSIVE dates AS (SELECT DATE('2024-01-01') AS dt UNION ALL SELECT dt + INTERVAL '1 day' FROM dates WHERE dt < '2024-01-05') SELECT * FROM dates; uses dt + INTERVAL '1 day' which is standard SQL for adding one day to a date.
Step 2: Check stopping condition and anchor
Anchor selects the start date as DATE type. Recursive part adds one day while date is less than '2024-01-05'.
Step 3: Compare other options
WITH RECURSIVE dates AS (SELECT DATE('2024-01-01') AS dt UNION ALL SELECT DATE(dt, '+1 day') FROM dates WHERE dt < '2024-01-05') SELECT * FROM dates; uses SQLite style DATE(dt, '+1 day'), which is not standard SQL. WITH RECURSIVE dates AS (SELECT '2024-01-01' AS dt UNION ALL SELECT dt + INTERVAL 1 DAY FROM dates WHERE dt <= '2024-01-05') SELECT * FROM dates; uses incorrect WHERE condition allowing extra date. WITH RECURSIVE dates AS (SELECT '2024-01-01' AS dt UNION ALL SELECT dt + 1 FROM dates WHERE dt < '2024-01-05') SELECT * FROM dates; adds integer to date incorrectly.
Final Answer:
WITH RECURSIVE dates AS (SELECT DATE('2024-01-01') AS dt UNION ALL SELECT dt + INTERVAL '1 day' FROM dates WHERE dt < '2024-01-05') SELECT * FROM dates; -> Option A
Quick Check:
Date + INTERVAL '1 day' is standard SQL date addition [OK]
Hint: Use INTERVAL '1 day' to add days in standard SQL [OK]
Common Mistakes:
Using database-specific date functions in standard SQL
Incorrect stopping condition allowing extra dates
Adding integer directly to date without INTERVAL
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.