您不能指定目标表“当啷”的更新在FROM子句
问题描述:
我有问题,从表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
。谁能帮忙?谢谢。
答
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。
谢谢!它可以像我需要的那样工作!我只需要编辑SET块为>'ba.jml_tersedia =( 选择 \t( \t IFNULL(SUM(pb.jml_beli),0) - IFNULL(SUM(pj.jml_jual),0) \t )' – Dewanta