如何使用 table B 和 table C 的连接返回的按日期计数更新 table A 中的按日期计数

How to update counts by date in table A with the counts by date returned from join of table B and table C

我可以使用临时 table 来做到这一点。 是否可以在单个更新查询中执行这两个步骤? TargetTable 中已经存在所有可能的日期(无需插入)。 我希望提高效率,因为它 运行 经常作为批量数据定期注入 table T2。

Table T1:在此批次中插入或更新的个别日期列表

Table T2:datetime2(3) 字段后跟几个数据字段,对于任何特定日期可能有数千个

目标:更新目标Table:日期字段后跟 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" 的 "Common Table Expression"。 CTE 可以替换您场景中的临时 table。您使用 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;

以下是有关常用 Table 表达式的更多信息:

https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql

完成此操作后,您可能会受益的另一件事是向 table T2 添加一个数据类型为 DATE 的新列。这个新列可以具有 Cast(T2.DateTime AS DATE) 的值。它甚至可能是一个(持久化的)计算列。然后在该新列上添加索引。如果您随后加入新列(而不是加入表达式 Cast(...) ),它可能 运行 更快,具体取决于数据的分布。判断它 运行 是否更快的唯一方法是尝试一下。