ACTUALIZAR tabla basada en la misma tabla

12

Tengo una tabla con descripciones de productos, y cada descripción de producto tiene a product_idy a language_id. Lo que quiero hacer es actualizar todos los campos con una language_idde 2ser igual a la misma product_iddonde el language_ides 1.

Hasta ahora he intentado la siguiente consulta, pero recibo errores que indican que MySQL no desea actualizar una tabla donde la tabla también se está utilizando en la subconsulta.

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

¿Hay alguna forma "simple" de evitar esta limitación en MySQL? ¿O algún "truco"? Estoy un poco sorprendido de que mi consulta no funcione, ya que parece lógico.

nathangiesbrecht
fuente

Respuestas:

19

Este es un negocio bastante arriesgado, y puedo entender por qué. Tiene que ver con la forma en que MySQL procesa las subconsultas. Escribí sobre eso el 22 de febrero de 2011: problema con la subconsulta MySQL

Realizar uniones que involucran SELECT y subconsulta SELECT están bien. Por otro lado, las ACTUALIZACIONES y ELIMINAR pueden ser una aventura bastante desafiante.

SUGERENCIA

Intente refactorizar la consulta para que sea una UNIÓN INTERNA de dos tablas

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;

Darle una oportunidad !!!

RolandoMySQLDBA
fuente
0

Bueno, esto no funcionó para mí, la actualización simplemente no sucedió a pesar de que había filas coincidentes. Lo que tuve que hacer es crear la otra tabla como subconsulta para que se use el archivo temporal.

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;
Galvani
fuente
-3
  1. Primero cree una vista / tabla temporal con la instrucción select
  2. Ejecutar consulta de actualización con combinación interna
Sankar Kodali
fuente
2
¿Quizás pueda mejorar la respuesta con algún código de muestra?
ypercubeᵀᴹ