2

我不愿意输入我想出的以下代码:

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' 的建议都会很棒。提前致谢。

4

1 回答 1

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);
于 2012-10-31T10:05:12.823 回答