在同一个表上使用from子句的mysql update语句

在同一个表上使用from子句的mysql update语句,mysql,sql,Mysql,Sql,以下是MS Sql server更新语句 Update HC_TranDetails SET InsPayments = (SELECT IsNull(SUM(ISNULL(CreditAmount,0)),0) From HC_TranDetails TDS Where TDS.TransactionType = 2 AND TDS.ClaimNo = T

以下是MS Sql server更新语句

    Update 
        HC_TranDetails
SET
        InsPayments = (SELECT IsNull(SUM(ISNULL(CreditAmount,0)),0) From HC_TranDetails TDS
                        Where TDS.TransactionType = 2 
                        AND TDS.ClaimNo = TD.ClaimNo 
                        AND TDS.LineItemNo = TD.LineItemNo 
                        AND IsNull(TDS.InsPlanRowID,'') <> ''
                        AND TDS.ReverseEntry <> 1 ),

        Adjustments = (SELECT IsNull(SUM(ISNULL(CreditAmount,0)),0) From HC_TranDetails TDS
                        Where TDS.TransactionType = 8
                        AND TDS.ClaimNo = TD.ClaimNo 
                        AND TDS.LineItemNo = TD.LineItemNo 
                        AND IsNull(TDS.InsPlanRowID,'') <> ''
                        AND TDS.ReverseEntry <> 1 ),


FROM
        HC_TranDetails TD

但它在第4行“From claimdail CDS”附近显示为语法错误。您可以使用一个子查询连接要更新的表,该子查询计算另一个表上每个
claimid的余额

通过使用
左联接
,它将更新表
claimdetails
上的所有记录。
0
的值将更新为子查询上任何不存在的
claimid

UPDATE  claimdetails a
        LEFT JOIN 
        (
            SELECT  claimID, 
                    SUM(IFNULL(debitamount, 0)) - SUM(IFNULL(creditamount,0)) bal
            FROM    claimdetail
            GROUP   BY claimID
        ) b ON a.claimID = b.claimID
SET     a.balanceAmount = IFNULL(b.bal, 0)

MySQL对同一个表上的更新非常敏感。简单的解决方法是包含额外级别的子查询。不过,正确的解决方法是使用联接

UPDATE claimdetails join
       (select claimid, IFNULL(SUM(IFNULL(debitamount,0)) -  SUM(IFNULL(creditamount,0)),0) as val
        from ClaimDetails
        group by claimid
       ) agg
       on claimdetails.claimid = agg.claimid
    SET balanceAmount = agg.val;
UPDATE claimdetails join
       (select claimid, IFNULL(SUM(IFNULL(debitamount,0)) -  SUM(IFNULL(creditamount,0)),0) as val
        from ClaimDetails
        group by claimid
       ) agg
       on claimdetails.claimid = agg.claimid
    SET balanceAmount = agg.val;