首先,将一个表中的数据和另一个表中经常更改的数据分成1:1关系并不是一个坏方法。其次,不清楚TemporalData.ChangeDate是否应该与MainDate.[Date]匹配。假设是这样,那么您可以这样做:
Select MainData.Key, MainData.[Date], MainData.a, MainData.b
, TemporalData.c, TemporalData.d
From MainData
Left Join TemporalData
On TemporalData.Key = MainData.Key
And TemporalData.ChangeDate = MainDate.[Date]
Where MainData.[Date] = @SomeDate
Create View vwMain
As
Select MainData.Key, MainData.[Date], MainData.a, MainData.b
, TemporalData.c, TemporalData.d
From MainData
Left Join TemporalData
On TemporalData.Key = MainData.Key
And TemporalData.ChangeDate = MainDate.[Date]
然后,您可以这样使用视图:
Select ...
From vwMain
Where [Date] = @SomeDate
编辑
With MainData As
(
Select 1 As [Key], '20101001' As [Date], 1.0 As A, 2.0 As B
Union All Select 1 As [Key], '20101002', 2.0, 3.0
Union All Select 1 As [Key], '20101003', 4.0, 5.0
Union All Select 1 As [Key], '20101004', 6.0, 3.0
)
, TemporalData As
(
Select 1 As [Key], '20101001' As [ChangeDate], 2.0 As C, 3.0 As D
Union All Select 1 As [Key], '20101003', 8.0, 9.0
)
, RankedResults As
(
Select MainData.[Key], MainData.[Date], MainData.a, MainData.b
, TemporalData.c, TemporalData.d, TemporalData.ChangeDate
, Row_Number() Over ( Partition By MainData.[Key], MainData.[Date]
Order By TemporalData.ChangeDate Desc ) As Num
From MainData
Join TemporalData
On TemporalData.Key = MainData.Key
And TemporalData.ChangeDate <= MainData.[Date]
)
Select *
From RankedResults
Where Num = 1
Order By [Date]