0

当我尝试更新 a_fees 表时,为什么会出现以下错误?据我所知,您不能将子选择标准建立在正在更新的表上吗?是因为 SQL 是向后读取的吗?我怎样才能解决这个问题?

错误消息:1093 - 您不能在 FROM 子句中指定目标表 'a_fees' 进行更新

UPDATE a_fees
SET active = 'N'
WHERE a_fees.fee_id IN
(
SELECT fee_id
FROM a_fees
WHERE verified = 'N'
HAVING audit_fees + audit_related_fees + tax_fees + other_fees < 5000);
4

1 回答 1

0

HAVING 子句与 GROUP BY 子句结合使用,您必须在 HAVING 子句上使用 SUM 之类的聚合函数,如下所示:

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

this sums autid_fees, audit_related_fees,tax_feesother_fees具有相同 fee_id 的每一行,然后检查它是否 < 5000。

但如果 fee_id 是唯一的,则意味着您必须求和的所有字段都在同一行,因此无需使用 GROUP BY 子句,您的查询可以简化为:

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

然后您的 UPDATE 查询变为:

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

你是对的:MySql 不允许你更新你在选择部分使用的同一个表,你应该只使用 JOINS 重写更新查询。

但如果 fee_id 是唯一的,则无需使用子查询,最好只使用不带子查询的 UPDATE:

UPDATE a_fees
SET active = 'N'
WHERE verified = 'N'
  AND audit_fees + audit_related_fees + tax_fees + other_fees < 5000;
于 2012-10-31T11:32:42.840 回答