2011-09-04 14 views
9

Mam następujące zapytanie MySQL:MySQL usunąć z zagnieżdżonych kwerendy wybierającej

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') 
) 
) 

Ale gdy próbuję wykonać pojawia się następujący komunikat o błędzie:

nie można określić tabelę docelową " Katalog "do aktualizacji w klauzuli FROM

Czy ktoś może doradzić, gdzie się nie udać?

Odpowiedz

13

wykonać podwójny gniazdowania

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 
) 

To głupcy mysql

+0

Działa idealnie zerkms, ale jaki jest powód konieczności "oszukiwania" MySQL? –

+0

Co, jeśli masz więcej niż jedną kolumnę "WHERE"? tj. "USUŃ Z katalogu WHERE ID_KONTAKTU I nazwa_Katalogu IN ..." – ThreaT

+0

@ThreaT: Nie jestem pewien, o co pytasz. Wiele predykatów można dodać za pomocą 'ADD', tak. – zerkms

4

Albo można użyć tabeli tymczasowej:

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); 

Przy zapytaniu dostałeś You can't specify target table 'catalogue' for update in FROM clause ponieważ nie można dokonać aktualizacji i wybierz na tej samej tabeli w jednym zapytaniu.

+0

Dziękuję Kamilowi ​​za wyjaśnienie. –

Powiązane problemy