【发布时间】:2019-08-06 20:32:03
【问题描述】:
我正在使用 SQL Server 2016 并尝试使用 SQL 通过一个查询一次更新表: 查询有不同的 Where 条件和子查询。 我已经尝试过条件但无法获得期望结果的案例
Update TPort
set DRecd =
((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.SchemeCode and
(CASE WHEN Divd.[RecordDate] > convert(varchar, TPort.TR_DATE, 101) and SCCode not in (3360,2059,291,288,2041,4003,5429,3724) THEN 1
WHEN Divd.[RecordDate] >= convert(varchar, TPort.TR_DATE, 101) and SCCode in (4003,5429,3724) THEN 1
WHEN Divd.EXDIVDATE >= convert(varchar, TPort.TR_DATE, 101) AND SCCode in (3360) THEN 1
WHEN Divd.EXDIVDATE > convert(varchar, TPort.TR_DATE, 101) AND SCCode in (2059,291,288,2041) THEN 1
ELSE 0
END )=1
and Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
) * UNITS)
Where TType like 'Reinvestment%' and IType = '3'
这里有 4 个查询:
Update TPort
set DRecd =
((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.Scode and Divd.[RecordDate] > convert(varchar, TPort.TR_DATE, 101)
and Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
) * UNITS)
Where TType like 'RInvest%' and IType = '3' and SCCode not in (3360,2059,291,288,2041,4003,5429,3724)
Update TPort set DRecd = ((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.Scode and Divd.[RecordDate] >= convert(varchar, TPort.TR_DATE, 101)
and Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
) * UNITS)
Where TType like 'RInvest%' and IType = '3' and SCCode in (4003,5429,3724)
Update TPort set DRecd = ((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.Scode and Divd.EXDIVDATE >= convert(varchar, TPort.TR_DATE, 101)
and Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
) * UNITS)
Where TType like 'RInvest%' and IType = '3' and SCCode in (3360)
Update TPort set DRecd = ((select IsNull(Sum(RSrate), 0) from TDiv Divd
Where TPort.SCCode = Divd.Scode and Divd.EXDIVDATE > convert(varchar, TPort.TR_DATE, 101)
and Divd.[RecordDate] < CONVERT(varchar,GETDATE(),101)
) * UNITS)
Where TType like 'RInvest%' and IType = '3' and SCCode in (2059,291,288,2041)
但是问题是对于子查询的每个位置,Rsrate 的总和应该不同?如果您检查所有四个查询都相同,除了 SCcode 和 子查询条件。我希望这能让它更清楚。
如何在 MS SQL Server 中执行此操作? 非常感激你的帮助。谢谢!
【问题讨论】:
-
看不到相关子查询在 4 次更新中有何不同。实际上,这 4 次更新会更新整个表,不包括
TType、IType、SCCode中的空值,其值完全取决于当前更新的原始数据。 -
子查询获取每个 Scode 各自的 TR_date 的 Rsrate 总和,但只有条件更改在表 EXDIVDATE (>,>=) 和 RecordDate(>,>=) 和更新表 SCCode 内
-
如 OP 子查询过滤器
TDiv中所写,仅由当前TPort原始更新中的Scode编写。提供示例输入数据和所需结果以阐明您的需求。
标签: sql sql-server optimization sql-update updates