如何使用 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(...) ),它可能 运行 更快,具体取决于数据的分布。判断它 运行 是否更快的唯一方法是尝试一下。
我可以使用临时 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(...) ),它可能 运行 更快,具体取决于数据的分布。判断它 运行 是否更快的唯一方法是尝试一下。