Cómo utilizar JOIN en sentencias UPDATE o DELETE.

Una práctica muy recomendable antes de lanzar una sentencia UPDATE o DELETE sobre un subconjunto de tuplas, es probar a realizar la proyección, afinando las condiciones de restricción para el subconjunto (mediante una sentencia WHERE). Cuando nos encontramos ante una condiciones sencillas, reutilizar la misma clausula WHERE es trivial. Pero qué sucede cuando queremos utilizar funciones de composición (JOIN) para restringir el conjunto de datos.

Ejemplo para UPDATE, donde se puede ver como se han utilizado varios JOINs en el bloque de referencia a la table (table_reference en el manual de MySql):

UPDATE table1 T1 INNER JOIN table2 T2 ON T1.id = T2.id INNER JOIN table3 T3 ON T3.other_id = T2.other_id INNER JOIN table4 T4 ON T4.category = T3.category SET T1.readed = 0 WHERE T1.type = 'X' AND T1.category  = 'A';

Ejemplo para DELETE. En este caso después del DELETE hay que especificar la tabla o tablas (multi-delete):

DELETE T2 FROM table2 T2 ON T1.id = T2.id INNER JOIN table3 T3 ON T3.other_id = T2.other_id INNER JOIN table4 T4 ON T4.category = T3.category WHERE T1.type = 'X' AND T1.category  = 'A';

Espero que estos ejemplos os sirvan de ayuda.

NOTA: Todos los ejemplos se han ejecutado en un servidor MySql version 5.1.

Actualización

Ejemplo para MS SQL 2005:

UPDATE table1 SET T1.readed = 0 FROM table1 T1 INNER JOIN table2 T2 ON T1.id = T2.id INNER JOIN table3 T3 ON T3.other_id = T2.other_id INNER JOIN table4 T4 ON T4.category = T3.category  WHERE T1.type = 'X' AND T1.category  = 'A';
  1. buen dia… necesito realizar una consulta con una estructura parecida… con el cambio que tengo una subconsulta en el left join y me marca el error The target table f of the UPDATE is not updatable Me podria ayudar. Gracias!

  2. Siguiendo tu ejemplo, este es mi código:
    UPDATE vincular
    SET v.dating =’Dating’, v.party=”, v.network=’Network’
    FROM vincular AS v
    INNER JOIN usuarios AS u
    ON u.idiusuario = v.idiusuario
    WHERE u.correo = ‘gabriel@sheep.com.mx’
    Sin embargo, me manda este mensaje de error:
    #1064 – You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ‘FROM vincular AS v INNER JOIN usuarios AS u ON u.idiusuario = v.idiusuario WH’ at line 3
    ¿dónde está mi error?

    • Hola Gabriel,

      Primero de todo, gracias por leer mi blog. En cuanto al código que comentas, si miras más detenidamente el ejemplo verás como tienes que hacer el SET al final, después de los JOINs y justo antes de hacer la cláusula WHERE.

      UPDATE table1 T1 INNER JOIN table2 T2 ON T1.id = T2.id INNER JOIN table3 T3 ON T3.other_id = T2.other_id INNER JOIN table4 T4 ON T4.category = T3.category SET T1.readed = 0 WHERE T1.TYPE = 'X' AND T1.category = 'A';

      Un saludo,
      Oscar.

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>