1

我在更新jml_tersedia表中的列时遇到问题barang。该值应为: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。任何人都可以帮忙吗?谢谢。

4

1 回答 1

1

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

我已将您的UPDATE查询改写为使用LEFT JOIN's 而不是嵌套的 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';

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

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

于 2012-12-15T13:50:45.973 回答