Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Hiểu kiểm tra kết thúc CTE đệ quy

Đây là một ví dụ tốt hơn về việc sử dụng ngày tháng. Giả sử chúng ta muốn xây dựng một bảng ngày tháng. 1 hàng cho mỗi tháng trong năm 2017. Chúng tôi tạo @startDate dưới dạng neo và @endDate như là kẻ hủy diệt. Chúng tôi đặt chúng cách nhau 12 tháng, vì chúng tôi muốn một năm duy nhất. Sau đó, đệ quy sẽ thêm một tháng qua DATEADD hàm đến @startDate cho đến khi gặp đầu cuối trong WHERE mệnh đề. Chúng tôi biết sẽ mất 11 lần đệ quy để đạt được 12 tháng ... tức là 11 tháng + ngày bắt đầu. Nếu chúng tôi đặt MAXRECURSION đến bất kỳ thứ gì nhỏ hơn 11, thì nó sẽ không thành công vì cần 11 để hoàn thành WHERE mệnh đề trong CTE đệ quy của chúng tôi , đó là dấu chấm hết ..

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

Đối với truy vấn của bạn, một phép nối đơn giản là đủ.

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

Tuy nhiên, tôi thấy rằng bạn đang cố gắng trả lại tệp này ở một định dạng kỳ lạ, định dạng này sẽ được xử lý trong ứng dụng báo cáo bạn đang sử dụng. Điều này sẽ giúp bạn đóng mà không cần đệ quy.

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. Câu lệnh thay thế cập nhật SQL

  2. Kết nối RStudio với SQL Server

  3. Thứ tự của các cột trong chỉ mục quan trọng như thế nào?

  4. Ngày giờ truyền SQL

  5. Lỗi kết nối SQL gián đoạn lạ, các bản sửa lỗi khi khởi động lại, quay lại sau 3-5 ngày (ASP.NET)