Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Memahami pemeriksaan penghentian CTE rekursif

Berikut adalah contoh yang lebih baik menggunakan tanggal. Asumsikan kita ingin membuat tabel tanggal. 1 baris untuk setiap bulan selama tahun 2017. Kami membuat @startDate sebagai jangkar dan @endDate sebagai terminatornya. Kami menetapkan ini menjadi 12 bulan terpisah, karena kami ingin satu tahun. Kemudian, rekursi akan menambahkan satu bulan melalui DATEADD fungsi ke @startDate sampai terminator bertemu di WHERE ayat. Kita tahu bahwa dibutuhkan 11 rekursi untuk mencapai 12 bulan... yaitu, 11 bulan + tanggal mulai. Jika kita mengatur MAXRECURSION untuk apa pun yang kurang dari 11, maka itu akan gagal karena 11 diperlukan untuk memenuhi WHERE klausa dalam CTE rekursif kami , itulah terminatornya..

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

Untuk kueri Anda, bergabung saja sudah cukup.

select 
  firstName
  ,lastName
  ,orderDate
  ,productID
from
  customers c
inner join
  orders o on o.customerID = c.id

Namun, saya melihat bahwa Anda mencoba mengembalikan ini dalam format yang aneh, yang harus ditangani dalam aplikasi pelaporan apa pun yang Anda gunakan. Ini akan membuat Anda dekat tanpa rekursi.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana pemicu saya dihapus?

  2. Perbandingan datetime SQL Server dalam format yang berbeda

  3. Dapatkan lembar Excel ke tabel temp menggunakan skrip

  4. Kesalahan nama kolom yang ambigu pada satu server tertentu

  5. Perbaiki Msg 8116 "Argument data type varchar is invalid for argument 1 of session_context function" di SQL Server