MySQL更新语句基于同一表中其他列的总和

时间:2012-10-31 09:52:38

标签: mysql sum updates having-clause

我不愿意输入我在下面提到的代码:

UPDATE a_fees
SET active = 'N'
WHERE EXISTS
(
SELECT fee_id, (
audit_fees + audit_related_fees + tax_fees + other_fees
) AS total_fees
FROM a_fees
WHERE verified = 'N'
GROUP BY fee_id
HAVING total_fees < 5000);

因为我运行这个类似的代码(下面),我得到了返回的表中的所有结果,这使我认为上面的代码将更新表中的所有记录。 当我进行子选择时,它只返回我关注的部分。 但是,当我添加最外层的选择语句时,它将返回整个表。

SELECT fee_id
FROM a_fees
WHERE EXISTS (

SELECT fee_id, (
audit_fees + audit_related_fees + tax_fees + other_fees
) AS total_fees
FROM a_fees
WHERE verified =  'N'
GROUP BY fee_id
HAVING total_fees <5000;

如果为表中四列总和小于$ 5,000的记录设置active ='N'的任何建议都会很棒。提前谢谢。

1 个答案:

答案 0 :(得分:1)

如果子查询返回至少一行,则认为满足EXISTS条件。 所以你是对的,第一个UPDATE可以更新表的所有记录。

您应该使用IN子句而不是EXISTS,并且也不需要使用GROUP BY子句,因为fee_id是唯一的:

SELECT fee_id
FROM a_fees
WHERE a_fees.fee_id IN (
  SELECT fee_id
  WHERE
    verified='N' AND
    audit_fees + audit_related_fees + tax_fees + other_fees <5000);

或者您应该将条件放在子查询中:

SELECT fee_id
FROM a_fees
WHERE EXISTS (
  SELECT fee_id
  FROM a_fees a_fees_1
  WHERE
    verified =  'N'
    AND a_fees_1.fee_id = a_fees.fee_id
    AND audit_fees + audit_related_fees + tax_fees + other_fees <5000);