簡體   English   中英

您不能在FROM子句中指定目標表“ barang”進行更新

[英]You can't specify target table 'barang' for update in FROM clause

我有問題更新列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 有人可以幫忙嗎? 謝謝。

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';

而且,如果此答案不適合您,那么您也可以查看這些出色的 答案以找到替代解決方案。

最后,您可以查閱MySQL的文檔以了解有關UPDATE Syntax的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM