【问题标题】:Update a table that I am sub-selecting from更新我从中子选择的表
【发布时间】:2012-10-31 11:14:20
【问题描述】:

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

【问题讨论】:

    标签: subquery sql-update


    【解决方案1】:

    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 的每一行,然后检查它是否为

    但如果 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;
    

    【讨论】:

    • 谢谢 :) 但我也在想,如果 a_fees.fee_id 是唯一的,则无需使用子查询,并且可以像我的上一个代码 sn-p 一样简化 UPDATE 查询
    • 谢谢!你摇滚。我认为括号可能有点不一致,但这一切都很有意义。谢谢!使用 stackoverflow 的体验真是太棒了!
    • 我刚刚执行了语句。像魅力一样工作。 :)
    猜你喜欢
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多