Во-первых, разбиение данных на соотношение 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
Это предполагает, что у вас всегда будут значения MainData, но могут не быть значения TemporalData.Вы можете поместить это в представление, но не можете указать параметр.Представление является виртуальной таблицей и, как таковое, представляет собой неупорядоченный набор строк.Таким образом, ваше представление будет выглядеть так:
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
РЕДАКТИРОВАТЬ
Это будетПохоже, что вы хотите всегда иметь строку TemporalData, представляющую самую последнюю дату.Это не ясно из вашего описания, хотя мы можем вывести его из ваших комментариев и примеров вывода.Итак, учитывая это, вот решение.Очевидно, что конечный результат не будет включать выражения общей таблицы для исходных данных примера:
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]