更新MySQL表-不能在From子句中指定更新的目标表
我有以下疑问:更新MySQL表-不能在From子句中指定更新的目标表,mysql,sql,Mysql,Sql,我有以下疑问: SELECT entity_id AS product_id FROM catalog_product_entity cpe LEFT JOIN cataloginventory_stock_item csi ON csi.product_id = cpe.entity_id WHERE cpe.type_id = 'configurable' AND csi.is_in_stock = 0 AND (SELECT SUM(qty) FROM catalog_product_re
SELECT entity_id AS product_id FROM catalog_product_entity cpe
LEFT JOIN cataloginventory_stock_item csi ON csi.product_id = cpe.entity_id
WHERE cpe.type_id = 'configurable'
AND csi.is_in_stock = 0
AND (SELECT SUM(qty) FROM catalog_product_relation cpr LEFT JOIN cataloginventory_stock_item cisi ON cisi.product_id = cpr.child_id WHERE cpr.parent_id = cpe.entity_id) > 0
返回以下结果:
product_id
-----------
912
906
894
559
364
我正在尝试根据上述查询结果中存在的表的产品id更新cataloginventory\u stock\u item表中的is\u in\u stock列
我想做的是:
UPDATE cataloginventory_stock_item
SET is_in_stock = 1
WHERE product_id IN (
SELECT entity_id AS product_id FROM catalog_product_entity cpe
LEFT JOIN cataloginventory_stock_item csi ON csi.product_id = cpe.entity_id
WHERE cpe.type_id = 'configurable'
AND csi.is_in_stock = 0
AND (SELECT SUM(qty) FROM catalog_product_relation cpr LEFT JOIN cataloginventory_stock_item cisi ON cisi.product_id = cpr.child_id WHERE cpr.parent_id = cpe.entity_id) > 0
)
我收到以下错误:
不能为FROM子句中的更新指定目标表“cataloginventory\u stock\u item”
我似乎不知道如何重新构造查询以使其工作。非常感谢您提供的任何帮助。请将别名提供给您,尝试使用此选项
UPDATE cataloginventory_stock_item
SET is_in_stock = 1
WHERE product_id IN (
SELECT new_table.product_id FROM (
SELECT entity_id AS product_id FROM catalog_product_entity cpe
LEFT JOIN cataloginventory_stock_item csi ON csi.product_id = cpe.entity_id
WHERE cpe.type_id = 'configurable'
AND csi.is_in_stock = 0
AND (SELECT SUM(qty) FROM catalog_product_relation cpr LEFT JOIN cataloginventory_stock_item cisi ON cisi.product_id = cpr.child_id WHERE cpr.parent_id = cpe.entity_id) > 0
) new_table
)
我相信下面的多表更新在不使用子查询的情况下也可以实现同样的功能:
UPDATE cataloginventory_stock_item AS csi
JOIN catalog_product_entity AS cpe ON csi.product_id = cpe.entity_id
JOIN catalog_product_relation AS cpr ON cpr.parent_id = cpe.entity_id
JOIN cataloginventory_stock_item AS cisi ON cisi.product_id = cpr.child_id
SET csi.is_in_stock = 1
WHERE cpe.type_id = 'configurable' AND csi.is_in_stock = 0 AND cisi.qty > 0;
我假设CII.qty从来都不是负数。因此,如果找到任何qty>0的行,那么SUMqty将大于零
PS:原始查询使用左连接,就像它是一个内部连接一样。您应该仔细研究。查看原始语句:由于WHERE子句中使用了csi.is\u In\u stock,主查询中的左连接最终成为内部连接。此外,由于子查询中缺少qty的别名,因此很难知道它来自哪个表;如果它来自cpr,那么子查询中的左连接是没有意义的。否则,它可能是一个内部连接,这正是我所期望的。我的查询可能效率不高,但是这是为了快速修复数据库,而不是为了生产实现。感谢您提供有关加入的提示。为了更好地理解它们的正确用法,我将对它们进行更多的研究。