我可以使用临时表来做到这一点。是否可以在单个更新查询中执行这两个步骤?TargetTable 中已经存在所有可能的日期(不需要插入)。我希望提高效率,因为它经常在批量数据定期倒入表 T2 时运行。
表 T1:在该批次中插入或更新的单个日期列表
表 T2:datetime2(3) 字段后跟几个数据字段,对于任何特定日期可能是数千个
目标:更新 TargetTable:日期字段后跟 int 字段以按日期保存总记录(可能刚刚进入 T2 或可能是附加到 T2 中现有记录的附加记录)
select T1.date as TargetDate, count(*) as CountF1
into #Temp
from T1 inner join T2
on T1.date = cast(T2.DateTime as date)
group by T1.date
update TargetTable
set TargetField1 = CountF1
from #Temp inner join TargetTable
on TargetDate = TargetTable.Date
我同意 Zohar Peled 的建议。使用通常缩写为“CTE”的“通用表表达式”。CTE 可以替换您的场景中的临时表。您可以使用 WITH 关键字编写 CTE,并且请记住,在许多情况下,您需要在 WITH 关键字之前(或者如果您愿意,可以在前一条语句的末尾)有一个分号。解决方案如下所示:
;WITH CTE AS
(
SELECT T1.date AS TargetDate, Count(*) AS CountF1
FROM T1 INNER JOIN T2
ON T1.date = Cast(T2.DateTime AS DATE)
GROUP BY T1.date
)
UPDATE TargetTable
SET TargetField1 = CTE.CountF1
FROM CTE INNER JOIN TargetTable
ON CTE.TargetDate = TargetTable.Date;
以下是有关通用表表达式的更多信息:
https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql
完成此操作后,您可能会从中受益的另一件事是向表 T2 添加一个新列,数据类型为 DATE。这个新列的值可能是 Cast(T2.DateTime AS DATE)。它甚至可能是(持久化的)计算列。然后在该新列上添加索引。如果然后加入新列(而不是加入表达式 Cast(...) ),它可能运行得更快,具体取决于数据的分布。判断它是否运行得更快的唯一方法是尝试一下。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句