2012-12-15 74 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

相關問題