我正在使用以下LOJ查询,该查询使用CTE生成一系列日期:
Declare @inquiryStartDate DateTime;
Declare @inquiryEndDate DateTime;
Declare @inquiryMortgageNumber nvarchar(50);
SET @inquiryStartDate = '2013-07-01';
SET @inquiryEndDate = '2013-07-31';
SET @inquiryMortgageNumber = '12345678';
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
WHERE f_MortgageSnapshots.MortgageNumber = @inquiryMortgageNumber;
我得到了这个:
但我想要这个:
我做错了什么?
快速注意,f_MortgageSnapshots表中只有2行可用于抵押12345678。
宣布@inquiryStartDate DateTime; 声明@inquiryEndDate DateTime; 声明@inquiryMortgageNumber nvarchar(50);
SET @inquiryStartDate ='2013-07-01'; SET @inquiryEndDate ='2013-07-31'; SET @inquiryMortgageNumber ='7078575';
With DateRange As (
SELECT ID, d_Dates.Date
FROM d_Dates
WHERE (d_Dates.Date BETWEEN @inquiryStartDate AND @inquiryEndDate)
)
Select DateRange.ID, DateRange.Date,f_MortgageSnapshots.MortgageNumber, f_MortgageSnapshots.Investor_ID
From DateRange Left Join f_MortgageSnapshots
On DateRange.ID = f_MortgageSnapshots.SnapshotDate_ID
And MortgageNumber = @inquiryMortgageNumber;
答案 0 :(得分:2)
试试这个:
With DateRange As (
SELECT ID, Date
FROM d_Dates
WHERE (Date BETWEEN @inquiryStartDate AND @inquiryEndDate)
)
Select d.ID, d.Date, s.MortgageNumber, s.Investor_ID
From DateRange d
Left Join f_MortgageSnapshots s
On d.ID = s.SnapshotDate_ID
And MortgageNumber = @inquiryMortgageNumber;
此外,使用CTE时,您真的不需要点击日期表
With DateRange As (
SELECT ID, inquiryStartDate ADate
Union All
Select ID + 1, ADate + 1
FROM DateRange
Where ADate < @inquiryEndDate)
Select d.ID, d.Date, s.MortgageNumber, s.Investor_ID
From DateRange d
Left Join f_MortgageSnapshots s
On d.ID = s.SnapshotDate_ID
And MortgageNumber = @inquiryMortgageNumber
OPTION (MAXRECURSION 2000);
如果您希望空行显示MortgageNumber
和Investor_ID
的某些默认值,请使用Coalesce()
函数:
With DateRange As (
SELECT ID, inquiryStartDate ADate
Union All
Select ID + 1, ADate + 1
FROM DateRange
Where ADate < @inquiryEndDate)
Select d.ID, d.Date,
Coalesce(s.MortgageNumber, 'DefaultMortgageNumber') MortgageNumber,
Coalesce(s.Investor_ID , -1) Investor_ID
From DateRange d
Left Join f_MortgageSnapshots s
On d.ID = s.SnapshotDate_ID
And MortgageNumber = @inquiryMortgageNumber
OPTION (MAXRECURSION 2000);
答案 1 :(得分:1)
我认为MortgageNumber过滤器实际上是来自f_MortgageSnapshots的过滤器。既然你有一个左连接,我会做这样的事情:
Declare @inquiryStartDate DateTime;
Declare @inquiryEndDate DateTime;
Declare @inquiryMortgageNumber nvarchar(50);
SET @inquiryStartDate = '2013-07-01';
SET @inquiryEndDate = '2013-07-31';
SET @inquiryMortgageNumber = '12345678';
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 and MortgageNumber = @inquiryMortgageNumber;