【问题标题】:How can I do an Combined UPDATE statement and Multiple Different Condition in SQL?如何在 SQL 中执行组合 UPDATE 语句和多个不同条件?
【发布时间】: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 次更新会更新整个表,不包括 TTypeITypeSCCode 中的空值,其值完全取决于当前更新的原始数据。
  • 子查询获取每个 Scode 各自的 TR_date 的 Rsrate 总和,但只有条件更改在表 EXDIVDATE (>,>=) 和 RecordDate(>,>=) 和更新表 SCCode 内
  • 如 OP 子查询过滤器 TDiv 中所写,仅由当前 TPort 原始更新中的 Scode 编写。提供示例输入数据和所需结果以阐明您的需求。

标签: sql sql-server optimization sql-update updates


【解决方案1】:

您可以为更新查询尝试以下语法 -

Update TP
SET DRecd = IsNull(Sum(RSrate), 0) * UNITS
FROM TPort TP
JOIN TDiv Divd ON TP.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)
WHERE TType like 'Reinvestment%' and IType = '3'

【讨论】:

    【解决方案2】:

    好的得到了答案,上面的答案几乎没有更正

    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 SCH_CODE = SCCode 
    ) * UNITS) 
    Where Tran_Type in ('Reinvestment','ReinvestmentAm','ReInvestmentTI') and IType = '3' and SCH_CODE = OSch_Code 
    

    【讨论】:

      猜你喜欢
      • 2022-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-16
      • 1970-01-01
      • 2018-10-12
      相关资源
      最近更新 更多