如何在 SQL 中执行组合更新语句和多个不同条件?

How can I do an Combined UPDATE statement and Multiple Different Condition in SQL?

我正在使用 SQL Server 2016 并尝试使用 SQL 通过一个查询立即更新 table: 查询具有不同的 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 服务器中执行此操作? 非常感激您的帮忙。谢谢!

您可以尝试使用以下语法进行更新查询 -

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'

好的,对上面的答案稍作修改就得到了答案

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