使用JOIN和子查询更新表

时间:2013-02-07 22:01:46

标签: mysql

我正在尝试运行一个JOIN到其他表的UPDATE,并在WHERE子句中有一个子查询。但是,我收到了这个错误:

  

1093 - 您无法在FROM子句

中为更新指定目标表'csi'

这是我的疑问:

UPDATE mage_cataloginventory_stock_item csi
INNER JOIN mage_catalog_product_entity cpe
ON csi.product_id = cpe.entity_id
SET csi.Is_in_Stock = 0
WHERE cpe.sku IN (
    SELECT cpe.sku
    FROM mage_catalog_product_entity cpe 
    INNER JOIN mage_cataloginventory_stock_item CSI
    ON CSI.product_id = cpe.entity_id
    INNER JOIN mage_cataloginventory_stock_status CISS
    ON CSI.product_id = CISS.product_ID
    INNER JOIN mage_catalog_product_entity_int cpei
    ON cpe.entity_id = cpei.entity_id
    WHERE type_id = 'simple'
    AND cpei.attribute_id = 80
    AND CSI.Qty = 0 AND cpei.value = 1
)

我从其他来源看到你无法在子查询中指定要更新的表,但我不知道如何做到这一点。希望有人可以帮助指出我正确的方向让我的工作因为我需要。谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用cpeCSI或您选择的任何名称替换子查询中的cpe2CSI2

以上内容根本不会考虑您更新的当前表格行。

可能这不是你想要的。在这种情况下,请尝试:

UPDATE mage_cataloginventory_stock_item csi
INNER JOIN mage_catalog_product_entity cpe
ON csi.product_id = cpe.entity_id
SET csi.Is_in_Stock = 0
WHERE cpe.sku IN (
    SELECT cpe.sku
    /* removed joins */
    FROM mage_cataloginventory_stock_status CISS
    INNER JOIN mage_catalog_product_entity_int cpei
    ON cpe.entity_id = cpei.entity_id
    WHERE type_id = 'simple'
    AND cpei.attribute_id = 80
    AND cpei.value = 1
    /* moved join condition here */
    AND cpe.product_id = CISS.product_ID
    AND CSI.Qty = 0
)

根据以下几点,以下内容可能会相同:(例如cpe.sku必须是唯一的,否则您可以将其与其他联接一起使用)

UPDATE mage_cataloginventory_stock_item csi
INNER JOIN mage_catalog_product_entity cpe
  ON csi.product_id = cpe.entity_id
INNER JOIN mage_cataloginventory_stock_status CISS
  ON cpe.product_id = CISS.product_ID
INNER JOIN mage_catalog_product_entity_int cpei
  ON cpe.entity_id = cpei.entity_id
SET csi.Is_in_Stock = 0
WHERE type_id = 'simple'
  AND cpei.attribute_id = 80
  AND cpei.value = 1
  AND CSI.Qty = 0