0

我最初在这里发布了这个问题,但遗憾的是现在我不得不转储抵押号码过滤器。事实证明这是一种痛苦。

我正在使用以下 LOJ 查询,它使用 CTE 来生成日期范围:

Declare @inquiryStartDate DateTime;
Declare @inquiryEndDate DateTime;

SET @inquiryStartDate = '2013-07-01';
SET @inquiryEndDate = '2013-07-31';

With DateRange As (
    SELECT ID, Date
    FROM     d_Dates
    WHERE  (Date BETWEEN @inquiryStartDate AND @inquiryEndDate)
)
Select DateRange.ID, DateRange.Date,f_MortgageSnapshots.MortgageNumber, f_MortgageSnapshots.Investor_ID
From DateRange
LEFT OUTER JOIN f_MortgageSnapshots On DateRange.ID = f_MortgageSnapshots.SnapshotDate_ID

我得到这样的东西:

在此处输入图像描述

但我想要这个:

在此处输入图像描述

我究竟做错了什么?在这种情况下,我不能在表之间进行左连接吗?

快速说明,f_MortgageSnapshots 表中只有 2 行用于抵押贷款 12345678。

在此处输入图像描述

对于那些想知道的人,这里是 d_Dates 表:

在此处输入图像描述

4

1 回答 1

1

看起来 d_dates 不包含查询日期范围内每个可能日期的行。

尝试类似的东西: -

create function [dbo].BuildDataRange
(
    @StartDate date,
    @EndDate date
)
returns @returntable table
(
    ID int,
    [Date] date
)
as
begin
    while @StartDate<=@EndDate begin
        insert into @returntable (ID, [Date]) values (
            DATEPART(year,@StartDate)*10000 + 
            DATEPART(month,@StartDate)*100 + 
            DATEPART(day,@StartDate),
            @StartDate)
        set @StartDate=DATEADD(day,1,@StartDate)
    end
    return
end
go

然后你应该能够: -

Declare @inquiryStartDate DateTime;
Declare @inquiryEndDate DateTime;

SET @inquiryStartDate = '2013-07-01';
SET @inquiryEndDate = '2013-07-31';

select *
from [dbo].BuildDataRange(@inquiryStartDate, @inquiryEndDate) dr
left join f_MortgageSnapshots On dr.ID = f_MortgageSnapshots.SnapshotDate_ID
于 2013-10-24T01:25:42.723 回答