更新我从中进行子选择的表

时间:2012-10-31 11:14:21

标签: subquery sql-update

当我尝试更新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);

1 个答案:

答案 0 :(得分: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;

sums autid_feesaudit_related_feestax_feesother_fees对于具有相同fee_id的每一行,然后检查它是否&lt; 1&lt; 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不允许你更新你在select部分中使用的同一个表,你应该只使用JOINS重写更新查询。

但是如果fee_id是唯一的,那么就不需要使用子查询,只使用没有子查询的UPDATE会更好:

UPDATE a_fees
SET active = 'N'
WHERE verified = 'N'
  AND audit_fees + audit_related_fees + tax_fees + other_fees < 5000;