sql >> Databáze >  >> RDS >> Sqlserver

Pochopení rekurzivní kontroly ukončení CTE

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



  1. Změna a uložení uživatelských dat mysql v tabulce zobrazení, která zobrazuje data uživatele

  2. PHP funkce pro extrahování hodnoty pole z databáze

  3. Jak funguje funkce QUOTENAME() v SQL Server (T-SQL)

  4. Instalace MADlib apt, jak na to?