2011-09-04 11 views
9

Tengo la siguiente consulta MySQL:MySQL borrar con consulta de selección anidado

DELETE FROM catalogue 
WHERE catalogue_id IN (
    SELECT catalogue_id 
    FROM catalogue 
    WHERE (
    product_id = (SELECT product_id FROM catalogue WHERE catalogue_id = '2290') 
    AND length_id = (SELECT length_id FROM catalogue WHERE catalogue_id = '2290') 
    AND gauge_id = (SELECT gauge_id FROM catalogue WHERE catalogue_id = '2290') 
) 
) 

Pero cuando intento ejecutar me sale el siguiente mensaje de error:

No se puede especificar la tabla de destino ' catálogo 'para la actualización en la cláusula FROM

¿Podría alguien aconsejarme dónde me estoy equivocando?

Respuesta

13

Realizar doble anidación

DELETE FROM catalogue 
WHERE catalogue_id IN (SELECT catalogue_id FROM (
    SELECT catalogue_id 
    FROM catalogue 
    WHERE (
    product_id = (SELECT product_id FROM catalogue WHERE catalogue_id = '2290') 
    AND length_id = (SELECT length_id FROM catalogue WHERE catalogue_id = '2290') 
    AND gauge_id = (SELECT gauge_id FROM catalogue WHERE catalogue_id = '2290') 
)) x 
) 

engaña MySQL

+0

Funciona perfectamente zerkms, pero ¿cuál es el motivo para tener que 'engañar' a MySQL? –

+0

¿Qué tal si tienes más de una columna 'WHERE'? es decir, 'ELIMINAR DEL catálogo DONDE catalogue_id AND catalogue_name IN ...' – ThreaT

+0

@ThreaT: No estoy seguro de lo que pregunta. Se pueden agregar múltiples predicados con 'ADD', yes. – zerkms

4

o puede utilizar tabla temporal:

CREATE TEMPORARY TABLE t AS 
    SELECT catalogue_id 
    FROM catalogue 
    WHERE (
    product_id = (SELECT product_id FROM catalogue WHERE catalogue_id = '2290') 
    AND length_id = (SELECT length_id FROM catalogue WHERE catalogue_id = '2290') 
    AND gauge_id = (SELECT gauge_id FROM catalogue WHERE catalogue_id = '2290') 
); 

    DELETE FROM catalogue WHERE catalogue_id IN (SELECT catalogue_id FROM t); 

Con la consulta que tienes You can't specify target table 'catalogue' for update in FROM clause porque no se puede hacer de selección y actualización en la misma tabla en una consulta.

+0

Gracias a Kamil por la explicación. –

Cuestiones relacionadas