我不愿意输入我在下面提到的代码:
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'的任何建议都会很棒。提前谢谢。
答案 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);