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 JOINSELECT

このクエリが必要なことを正確に実行するかどうかは完全にはわかりません。最初に、の目的の更新値を取得することを確認する必要がありますbarang.jml_tersediaSELECTこれが、クエリとして言い換えられたものです。

確認

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構文の詳細を確認できます。

于 2012-12-15T13:50:45.973 に答える