【问题标题】:You can't specify target table 'barang' for update in FROM clause您不能在 FROM 子句中指定目标表 'barang' 进行更新
【发布时间】:2012-12-03 06:21:18
【问题描述】:

我在更新表 barang 中的列 jml_tersedia 时遇到问题。该值应为:barang.jml_tersedia = pembelian.jml_beli - penjualan.jml_jual

这是我的代码:

update barang set jml_tersedia =
(
  ( select ifnull(sum(jml_beli), 0) 
    from pembelian 
    where pembelian.id_barang = (select id_barang 
                                 from barang 
                                 where nama_barang = 'folio')
  ) - 
  ( select ifnull(sum(jml_jual), 0) 
    from penjualan 
    where penjualan.id_barang = (select id_barang 
                                 from barang 
                                 where nama_barang = 'folio')
  ) 
)
where barang.nama_barang = 'folio';

它给了我You can't specify target table 'barang' for update in FROM clause。任何人都可以帮忙吗?谢谢。

【问题讨论】:

    标签: mysql sql-update mysql-error-1093


    【解决方案1】:

    MySQL 不允许您修改您选择的同一个表,但它允许您在UPDATE 子句中指定多个表。

    我已将您的 UPDATE 查询改写为使用 LEFT JOIN,而不是嵌套的 sub-SELECT

    由于我不能完全确定此查询是否完全符合您的要求,您应该首先确认您将获得barang.jml_tersedia 的所需更新值。在这里,重新表述为SELECT 查询:

    验证

    SELECT
        (
            IFNULL(SUM(pb.jml_beli), 0) -
            IFNULL(SUM(pj.jml_jual), 0)
        ) AS new_jml_tersedia
    FROM
        barang ba
        LEFT JOIN pembelian pb ON (ba.id_barang = pb.id_barang)
        LEFT JOIN penjualan pj ON (ba.id_barang = pj.id_barang)
    WHERE
        ba.nama_barang = 'folio';
    

    一旦您确定它返回正确的更新值,您就可以运行它,如下所示:

    更新

    UPDATE
        barang ba
        LEFT JOIN pembelian pb ON (ba.id_barang = pb.id_barang)
        LEFT JOIN penjualan pj ON (ba.id_barang = pj.id_barang)
    SET
        ba.jml_tersedia = (
            IFNULL(SUM(pb.jml_beli), 0) -
            IFNULL(SUM(pj.jml_jual), 0)
        );
    WHERE
        ba.nama_barang = 'folio';
    

    而且,如果这个答案不适合您,那么您还可以查看这些 excellent answers 以获取替代解决方案。

    最后,您可以查阅 MySQL 的文档以了解有关 UPDATE Syntax 的更多信息。

    【讨论】:

    • 谢谢!它就像我需要的那样工作!我只需要将 SET 块编辑为 >ba.jml_tersedia = ( select ( IFNULL(SUM(pb.jml_beli), 0) - IFNULL(SUM(pj.jml_jual), 0) )
    猜你喜欢
    • 2017-01-12
    • 2013-07-05
    • 1970-01-01
    • 2016-05-19
    • 2012-03-06
    • 2015-06-08
    • 2015-07-11
    • 2016-08-25
    • 1970-01-01
    相关资源
    最近更新 更多