Zde je lepší příklad použití dat. Předpokládejme, že chceme vytvořit tabulku dat. 1 řádek pro každý měsíc pro rok 2017. Vytvoříme @startDate
jako kotva a @endDate
jako terminátor. Nastavili jsme je na 12 měsíců od sebe, protože chceme jeden rok. Poté rekurze přidá jeden měsíc prostřednictvím DATEADD
funkce na @startDate
dokud není splněn terminátor v WHERE
doložka. Víme, že bude trvat 11 rekurzí, než dosáhnete 12 měsíců... tedy 11 měsíců + datum zahájení. Pokud nastavíme MAXRECURSION
na cokoliv menšího než 11, pak selže, protože 11 je potřeba ke splnění WHERE
klauzule v našem rekurzivním CTE
, to je terminátor..
declare @startDate datetime = '20170101'
declare @endDate datetime = '20171201'
;WITH Months
as
(
SELECT @startDate as TheDate --anchor
UNION ALL
SELECT DATEADD(month, 1, TheDate) --recursive
FROM Months
WHERE TheDate < @endDate --terminator... i.e. continue until this condition is met
)
SELECT * FROM Months OPTION (MAXRECURSION 10) --change this to 11
Pro váš dotaz by stačilo jednoduché spojení.
select
firstName
,lastName
,orderDate
,productID
from
customers c
inner join
orders o on o.customerID = c.id
Vidím však, že se to pokoušíte vrátit v podivném formátu, který by měl být zpracován v jakékoli aplikaci pro vytváření zpráv, kterou používáte. Tím byste se dostali blízko bez rekurze.
with cte as(
select
firstName
,lastName
,orderDate
,productID
,dense_rank() over(order by c.id) as RN
from
customers c
inner join
orders o on o.customerID = c.id)
select distinct
firstName
,lastName
,null
,null
,RN
from
cte
union all
select
''
,''
,orderDate
,productID
,RN
from
cte
order by RN, firstName desc