Có một số cách để xử lý các hàng bị thiếu, nhưng tất cả đều là về việc có một bộ dữ liệu khác để kết hợp với kết quả hiện tại của bạn.
Điều đó có thể bắt nguồn từ kết quả của bạn, được tạo bởi CTE hoặc quy trình khác (chẳng hạn như ví dụ của bạn) hoặc (tùy chọn của tôi) bằng cách sử dụng mẫu vĩnh viễn tham gia chống lại.
Mẫu trong trường hợp của bạn có thể chỉ là một bảng ngày tháng, như @datesTBL của bạn. Sự khác biệt là nó được tạo ra trước, ví dụ, có giá trị 100 năm.
Khi đó, truy vấn của bạn có thể tương tự với ví dụ của bạn, nhưng tôi sẽ thử như sau ...
SELECT
dt.tempDate ,
InstructorID, EventStart,
EventEnd, cancelled,
cancelledInstructor,
EventType, DevName,
Room, SimLocation,
ClassLocation, Event,
Duration, TrainingDesc,
Crew, Notes,
LastAmended, InstLastAmended,
ChangeAcknowledged, Type,
OtherType, OtherTypeDesc,
CourseType
FROM
@datesTBL dt
LEFT OUTER JOIN
OpsInstructorEventsView iv
ON iv.EventStart >= dt.tempDate
AND iv.EventStart < dt.tempDate + 1
AND iv.InstructorID = @InstructorID
WHERE
dt.tempDate >= @StartDate
AND dt.tempDate <= @EndDate
ORDER BY
dt.tempDate,
iv.EventStart
Điều này đặt mẫu lịch trên LEFT, và do đó, làm cho nhiều truy vấn dễ dàng hơn vì bạn biết trường ngày của lịch luôn được điền, luôn là giá trị chỉ ngày (không có phần thời gian), theo thứ tự, rất đơn giản để GROUP BY, v.v.