我有两个表,定义如下:
PTable:
[StartDate], [EndDate], [Type], PValue
.................................................
2011-07-01 2011-07-07 001 5
2011-07-08 2011-07-14 001 10
2011-07-01 2011-07-07 002 15
2011-07-08 2011-07-14 002 20
TTable:
[Date], [Type], [TValue]
..................................
2011-07-01 001 11
2011-07-02 001 4
2011-07-03 001 0
2011-07-08 002 12
2011-07-09 002 12
2011-07-10 002 0
我想用 PTable 中的 PValue 更新 TTable 中的 Tvalue 列,其中 TTable 中的 [Date] 介于 PTable 中的 [StartDate] 和 [EndDate] 之间,并且 DATEDIFF(DAY,TTable.[Date],PTable.[EndDate]) 是最小值, 和 PTable.Type = TTable.Type
最终的 TTable 应该如下所示:
[Date], [Type], [TValue]
..................................
2011-07-01 001 11
2011-07-02 001 4
2011-07-03 001 5 --updated
2011-07-08 002 12
2011-07-09 002 12
2011-07-10 002 20 --updated
我试过的是这样的:
UPDATE [TTable]
SET
TValue = T1.PValue
FROM TTable
INNER JOIN PTable T1 ON
[Date] BETWEEN T1.StartDate AND T1.EndDate
AND DATEDIFF(DAY,[Date],T1.EndDate) =
(SELECT MIN( DATEDIFF(DAY,TTable.[Date],T.EndDate) )
FROM PTable T WHERE TTable.[Date] BETWEEN T.StartDate AND T.EndDate
)
AND
T1.[Type] = TTable.[Type]
它给了我这个错误: “在包含外部引用的聚合表达式中指定了多个列。如果正在聚合的表达式包含外部引用,则该外部引用必须是表达式中引用的唯一列。”
后期编辑:
考虑到TTable AS T和PTable AS P,更新的条件是:
1. T.Type = P.Type
2. T.Date BETWEEN P.StartDate AND P.EndDate
3. DATEDIFF(DAY,T.Date,P.EndDate) = minimum value of all DATEDIFFs WHERE P.Type = T.Type AND T.Date BETWEEN P.StartDate AND P.EndDate
后来编辑2:对不起,因为我在PTable的最后一行输入错误(2011-08-10而不是2011-07-14),最终结果是错误的。
我还设法以更简单的方式进行了更新,显然我应该从一开始就尝试过:
UPDATE TTABLE
SET
TValue = T1.PValue
FROM TTable
INNER JOIN PTABLE T1 ON
[Date] = (SELECT TOP(1) MAX(Date) FROM [TTABLE] WHERE [Date] BETWEEN T1.StartDate AND T1.EndDate)
AND
T1.Type = [TTABLE].Type
为此表示歉意。