A common table expression (CTE) provides the significant advantage of being able to reference itself, thereby creating a recursive CTE. A recursive CTE is one in which an initial CTE is repeatedly executed to return subsets of data until the complete result set is obtained.
Generating an Organizational Hierarchy using a Recursive CTE
DECLARE @emp TABLE (EmpID INT, Title VARCHAR(15), ParentID INT)
INSERT INTO @emp(EmpID, Title, ParentID) SELECT 1, 'CEO', NULL
INSERT INTO @emp(EmpID, Title, ParentID) SELECT 2, 'PM 1', 1
INSERT INTO @emp(EmpID, Title, ParentID) SELECT 3, 'CFO', 1
INSERT INTO @emp(EmpID, Title, ParentID) SELECT 4, 'Tech Lead', 2
INSERT INTO @emp(EmpID, Title, ParentID) SELECT 5, 'Accountant', 3
INSERT INTO @emp(EmpID, Title, ParentID) SELECT 6, 'Developer', 4
INSERT INTO @emp(EmpID, Title, ParentID) SELECT 7, 'DBA', 4
;WITH cte AS (
SELECT 0 AS Lvl, EmpID, Title
FROM @emp WHERE ParentID IS NULL
UNION ALL
SELECT p.lvl + 1, c.EmpID, c.Title
FROM @emp c
INNER JOIN cte p ON p.EmpID = c.ParentID
)
SELECT
SPACE(lvl * 4) + Title AS Hierarchy
FROM cte
/*
Hierarchy
--------------------------------------------------
CEO
PM 1
CFO
Accountant
Tech Lead
Developer
DBA
*/
Generating a Date Series using a Recursive CTE
DECLARE @startDate DATETIME, @endDate DATETIME
SELECT @startDate = '2009-01-01', @endDate = '2009-01-10'
;WITH cte AS (
SELECT @startDate AS dt
UNION ALL
SELECT dt + 1 FROM cte
WHERE dt + 1 <= @endDate
)
SELECT * FROM cte
/*
dt
-----------------------
2009-01-01 00:00:00.000
2009-01-02 00:00:00.000
2009-01-03 00:00:00.000
2009-01-04 00:00:00.000
2009-01-05 00:00:00.000
2009-01-06 00:00:00.000
2009-01-07 00:00:00.000
2009-01-08 00:00:00.000
2009-01-09 00:00:00.000
2009-01-10 00:00:00.000
*/