2012-12-15 36 views
1

我有问题,从表barang更新列jml_tersedia。值应该是:barang.jml_tersedia = pembelian.jml_beli - penjualan.jml_jual您不能指定目标表“当啷”的更新在FROM子句

这里是我的代码:

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。谁能帮忙?谢谢。

回答

1

MySQL不会让你修改你从选择相同的表,但它确实让你指定UPDATE子句中的多个表。

我修改了您的UPDATE查询以使用LEFT JOIN而不是嵌套子SELECT's。

因为我不是完全肯定此查询会做的正是你需要什么,你应该首先确认您将获得所需的更新值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'; 

而且,如果这个答案不工作那么你也可以看看这些excellentanswers替代解决方案。

最后,你可以咨询MySQL的文档,以了解更多有关UPDATE Syntax

+0

谢谢!它可以像我需要的那样工作!我只需要编辑SET块为>'ba.jml_tersedia =( 选择 \t( \t IFNULL(SUM(pb.jml_beli),0) - IFNULL(SUM(pj.jml_jual),0) \t )' – Dewanta

相关问题