Đâ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