基于同一表的UPDATE表


12

我有一张带有产品说明的表格,每个产品说明都有一个product_id和一个language_id。我想要做的就是更新所有与字段language_id2等于同product_idlanguage_id1

到目前为止,我已经尝试了以下查询,但是却收到错误消息,指示MySQL不想更新在子查询中也使用该表的表。

UPDATE
  products_description AS pd
SET 
  pd.products_seo = (
    SELECT
      pd2.products_seo
    FROM 
      products_description AS pd2
    WHERE
        pd2.language_id = 1
    AND pd2.products_id = pd.products_id
  )
WHERE
  pd.language_id <> 1

在MySQL中是否有解决此限制的“简单”方法?还是任何“技巧”?我的查询无法正常运作,这有点合逻辑,这让我感到有些惊讶。

Answers:


19

这是相当冒险的业务,我可以理解为什么。它与MySQL处理子查询的方式有关。我在2011年2月22日写了有关它的文章: MySQL子查询问题

执行涉及SELECT和子查询SELECT的JOIN是可以的。从另一方面讲,UPDATE和DELETE可能是一个令人生畏的冒险。

建议

尝试重构查询,使其成为两个表的INNER JOIN

UPDATE
    products_description pd INNER JOIN products_description pd2 ON
    (pd.products_id=pd2.products_id AND pd2.language_id=1 AND pd.language_id<>1)
SET pd.products_seo = pd2.products_seo;

试试看 !!!


0

嗯,这对我不起作用,即使有匹配的行,更新也没有发生。我要做的是创建另一个表作为子查询,以便使用临时文件。

UPDATE tmContact 
INNER JOIN (
SELECT par.id, IF (LENGTH(contact.dynamicValues) > LENGTH(par.dynamicValues), contact.dynamicValues, par.dynamicValues) upd FROM tmContact par
INNER JOIN tmContact contact ON par.id = contact.linkCompanyId AND contact.linkCompanyId IS NOT NULL
WHERE contact.id IS NOT NULL AND contact.dynamicValues <>  par.dynamicValues AND LENGTH(contact.dynamicValues) > LENGTH(par.dynamicValues)
) input ON input.id = tmContact.id
SET tmContact.dynamicValues = upd;

-3
  1. 首先使用select语句创建视图/临时表
  2. 使用内部联接运行更新查询

2
也许您可以通过一些示例代码来改善答案?
ypercubeᵀᴹ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.